{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Differentiable Convex Optimization Layers: JAX Tutorial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import cvxpy as cp\n",
    "import numpy as np\n",
    "\n",
    "import jax\n",
    "import jax.numpy as jnp\n",
    "from cvxpylayers.jax import CvxpyLayer\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('bmh')\n",
    "\n",
    "np.set_printoptions(precision=2, suppress=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook introduces the [JAX](https://github.com/google/jax)\n",
    "library accompanying our\n",
    "[NeurIPS paper](https://web.stanford.edu/~boyd/papers/pdf/diff_cvxpy.pdf)\n",
    "on differentiable convex optimization layers with [CVXPY](https://www.cvxpy.org/).\n",
    "A convex optimization layer solves a parametrized convex optimization problem\n",
    "in the forward pass to produce a solution.\n",
    "It computes the derivative of the solution with respect to the\n",
    "parameters in the backward pass.\n",
    "For more details, see our main repository at\n",
    "[cvxgrp/cvxpylayers](https://github.com/cvxgrp/cvxpylayers)\n",
    "and our\n",
    "[blog post](https://locuslab.github.io/2019-10-28-cvxpylayers/).\n",
    "\n",
    "## Parametrized convex optimization\n",
    "Express problems of the form\n",
    "$$\n",
    "\\begin{array}{ll} \\mbox{minimize} & f_0(x;\\theta)\\\\\n",
    "\\mbox{subject to} & f_i(x;\\theta) \\leq 0, \\quad i=1, \\ldots, m\\\\\n",
    "& A(\\theta)x=b(\\theta),\n",
    "\\end{array}\n",
    "$$\n",
    "with variable $x \\in \\mathbf{R}^n$ and parameters $\\theta\\in\\Theta\\subseteq\\mathbf{R}^p$\n",
    "\n",
    "* objective and inequality constraints $f_0, \\ldots, f_m$ are *convex* in $x$ for each $\\theta$, *i.e.*, their graphs curve upward\n",
    "* equality constraints are linear\n",
    "* for a given value of $\\theta$, find a value for $x$ that minimizes objective, while satisfying constraints\n",
    "* we can efficiently solve these globally with near-total reliability"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Solution map\n",
    "* Solution $x^\\star$ is an implicit function of $\\theta$\n",
    "* When unique, define solution map as function\n",
    "$x^\\star = \\mathcal S(\\theta)$\n",
    "* Need to call numerical solver to evaluate\n",
    "* This function is often differentiable\n",
    "* We show how to analytically differentiate this function, using the implicit function theorem\n",
    "* Benefits of analytical differentiation: works with nonsmooth objective/constraints, low memory usage, don't compound errors"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CVXPY\n",
    "* High level domain-specific language (DSL) for convex optimization\n",
    "* Define variables, parameters, objective, and constraints\n",
    "* Synthesize into problem object, then call solve method\n",
    "* We've added derivatives to CVXPY (forward and backward)\n",
    "* More information available [here](https://www.cvxpy.org/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CVXPYlayers\n",
    "![](https://github.com/cvxgrp/cvxpylayers/blob/master/cvxpylayers_logo.png?raw=true)\n",
    "* Convert CVXPY problems into callable, differentiable Pytorch and Tensorflow modules in one line"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Applications of differentiable convex optimization\n",
    "* [learning convex optimization models (structured prediction)](https://stanford.edu/~boyd/papers/learning_copt_models.html)\n",
    "* learning decision-making policies (reinforcement learning)\n",
    "  * [differentiable model-predictive control](https://arxiv.org/abs/1810.13400)\n",
    "  * [convex optimization control policies](https://stanford.edu/~boyd/papers/learning_cocps.html)\n",
    "* [machine learning hyper-parameter tuning and feature engineering](https://stanford.edu/~boyd/papers/lsat.html)\n",
    "* [repairing infeasible or unbounded optimization problems](https://stanford.edu/~boyd/papers/auto_repair_cvx.html)\n",
    "* [as protection layers in neural networks](http://physbam.stanford.edu/~fedkiw/papers/stanford2019-10.pdf)\n",
    "* [learning constraints and rules](https://arxiv.org/abs/1703.00443)\n",
    "* [custom neural network layers (sparsemax, csoftmax, csparsemax, LML)]( https://locuslab.github.io/2019-10-28-cvxpylayers/)\n",
    "* [meta-learning through differentiable solvers](https://arxiv.org/abs/1904.03758)\n",
    "* [and many more... ](https://github.com/bamos/thesis)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ReLU, sigmoid, and softmax examples\n",
    "\n",
    "This example follows the setup in\n",
    "[our blog post](https://locuslab.github.io/2019-10-28-cvxpylayers/)\n",
    "and shows how to implement standard activation functions\n",
    "as differentiable convex optimization layers.\n",
    "These are presented as an exercise to illustrate the\n",
    "representational and modeling power of differentiable convex\n",
    "optimization, and for these examples, provides no implementation\n",
    "benefit over the original forms of these layers.\n",
    "\n",
    "## The ReLU\n",
    "\n",
    "As shown in [Section 2.4 here](https://github.com/bamos/thesis).\n",
    "we can interpret the ReLU as projecting\n",
    "a point $x\\in\\mathbb{R}^n$ onto the non-negative orthant as\n",
    "\n",
    "$$\n",
    "  \\hat y = {\\rm argmin}_y \\;\\; \\frac{1}{2}||y-x||_2^2 \\;\\; {\\rm s.t.} \\;\\; y\\geq 0.\n",
    "$$\n",
    "\n",
    "The usual explicit solution can be obtained by taking the\n",
    "first-order optimality conditions.\n",
    "\n",
    "Using `cvxpylayers`, we are able to easily implement\n",
    "this optimization problem as a JAX layer.\n",
    "This is powerful since it does not require that\n",
    "our optimization problem has an explicit closed-form\n",
    "solution (even though the ReLU does) and this\n",
    "also shows how easy we can now take this optimization\n",
    "problem and tweak it if we wanted to do so, without\n",
    "having to re-derive the appropriate solution and\n",
    "backwards pass.\n",
    "Since this is computing the same function as the ReLU,\n",
    "we would expect that the derivative looks the same.\n",
    "This is indeed true and we have made it so our optimization layer\n",
    "can be differentiated through just like any other JAX layer\n",
    "using automatic differentiation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, '$\\\\nabla f(x)$')"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Implement the problem as usual with CVXPY:\n",
    "n = 100\n",
    "_x = cp.Parameter(n)\n",
    "_y = cp.Variable(n)\n",
    "obj = cp.Minimize(cp.sum_squares(_y-_x))\n",
    "cons = [_y >= 0]\n",
    "prob = cp.Problem(obj, cons)\n",
    "\n",
    "# Create the JAX layer\n",
    "relu_layer = CvxpyLayer(prob, parameters=[_x], variables=[_y])\n",
    "\n",
    "# Differentiate through the JAX layer\n",
    "def relu_layer_sum(x):\n",
    "    return jnp.sum(relu_layer(x)[0])\n",
    "\n",
    "drelu_layer = jax.grad(relu_layer_sum)\n",
    "\n",
    "nrow, ncol = 1, 2\n",
    "fig, axs = plt.subplots(nrow, ncol, figsize=(6*ncol, 4*nrow))\n",
    "fig.suptitle('The ReLU')\n",
    "\n",
    "x = jnp.linspace(-5, 5, num=n)\n",
    "\n",
    "ax = axs[0]\n",
    "ax.plot(x, relu_layer(x)[0])\n",
    "ax.set_xlabel('$x$')\n",
    "ax.set_ylabel('$f(x)$')\n",
    "\n",
    "ax = axs[1]\n",
    "ax.plot(x, drelu_layer(x))\n",
    "ax.set_xlabel('$x$')\n",
    "ax.set_ylabel(r'$\\nabla f(x)$')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The sigmoid\n",
    "\n",
    "Similarly, **the sigmoid or logistic** activation\n",
    "function $f(x) = (1+e^{-x})^{-1}$ can be\n",
    "seen from a convex optimization perspective as discussed in\n",
    "[Section 2.4 here](https://github.com/bamos/thesis).\n",
    "The sigmoid\n",
    "projects a point $x\\in\\mathbb{R}^n$ onto\n",
    "the interior of the unit hypercube as\n",
    "\n",
    "$$\n",
    "  f(x) = {\\rm argmin}_{0\\lt y\\lt 1} \\; -x^\\top y -H_b(y),\n",
    "$$\n",
    "\n",
    "where $H_b(y) = - \\left(\\sum_i y_i\\log y_i + (1-y_i)\\log (1-y_i)\\right)$ is the\n",
    "binary entropy function.\n",
    "This can be proved by looking at the KKT conditions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, '$\\\\nabla f(x)$')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n = 100\n",
    "\n",
    "_x = cp.Parameter(n)\n",
    "_y = cp.Variable(n)\n",
    "obj = cp.Minimize(-_x.T@ _y - cp.sum(cp.entr(_y) + cp.entr(1.-_y)))\n",
    "prob = cp.Problem(obj)\n",
    "\n",
    "layer = CvxpyLayer(prob, parameters=[_x], variables=[_y])\n",
    "\n",
    "# Differentiate through the JAX layer\n",
    "def layer_sum(x):\n",
    "    return jnp.sum(layer(x)[0])\n",
    "\n",
    "dlayer = jax.grad(layer_sum)\n",
    "\n",
    "nrow, ncol = 1, 2\n",
    "fig, axs = plt.subplots(nrow, ncol, figsize=(6*ncol, 4*nrow))\n",
    "fig.suptitle('The Sigmoid')\n",
    "\n",
    "x = jnp.linspace(-5, 5, num=n)\n",
    "\n",
    "ax = axs[0]\n",
    "ax.plot(x, layer(x)[0])\n",
    "ax.set_xlabel('$x$')\n",
    "ax.set_ylabel('$f(x)$')\n",
    "\n",
    "ax = axs[1]\n",
    "ax.plot(x, dlayer(x))\n",
    "ax.set_xlabel('$x$')\n",
    "ax.set_ylabel(r'$\\nabla f(x)$')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The softmax\n",
    "Lastly the **softmax** activation function\n",
    "$f(x)\\_j = e^{x\\_j} / \\sum\\_i e^{x\\_i}$ can\n",
    "be implemented in JAX as follows.\n",
    "This time we'll consider a single vector\n",
    "instead of range of values since the softmax is\n",
    "only interesting in higher dimensions.\n",
    "\n",
    "\n",
    "We can again interpret the softmax as projecting a point\n",
    "$x\\in\\mathbb{R}^n$ onto\n",
    "the interior of the $(n-1)$-simplex\n",
    "$$\\Delta_{n-1}=\\{p\\in\\mathbb{R}^n\\; \\vert\\; 1^\\top p = 1 \\; \\; {\\rm and} \\;\\; p \\geq 0 \\}$$\n",
    "as\n",
    "\n",
    "$$\n",
    "  f(x) = {\\rm argmin}_{0\\lt y\\lt 1} \\;\\; -x^\\top y - H(y) \\;\\; {\\rm s.t.}\\;\\; 1^\\top y = 1\n",
    "$$\n",
    "\n",
    "where $H(y) = -\\sum\\_i y\\_i \\log y\\_i$ is the entropy function.\n",
    "This is also proved in [Section 2.4 here](https://github.com/bamos/thesis)\n",
    "by using the KKT conditions.\n",
    "We can implement the variational form of the softmax with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=== Softmax forward pass\n",
      "jax.nn.softmax:  [0.02 0.01 0.66 0.27 0.03]\n",
      "Convex optimization layer:  [0.02 0.01 0.66 0.27 0.03]\n",
      "\n",
      "=== Softmax backward pass\n",
      "jax.nn.softmax:  [ 0.02 -0.   -0.01 -0.01 -0.  ]\n",
      "Convex optimization layer:  [ 0.02 -0.   -0.01 -0.01 -0.  ]\n"
     ]
    }
   ],
   "source": [
    "d = 5\n",
    "_x = cp.Parameter(d)\n",
    "_y = cp.Variable(d)\n",
    "obj = cp.Minimize(-_x.T @ _y - cp.sum(cp.entr(_y)))\n",
    "cons = [np.ones(d).T @ _y == 1.]\n",
    "prob = cp.Problem(obj, cons)\n",
    "layer = CvxpyLayer(prob, parameters=[_x], variables=[_y])\n",
    "\n",
    "key = jax.random.PRNGKey(0)\n",
    "key, k1 = jax.random.split(key, 2)\n",
    "x = jax.random.normal(k1, shape=(d,))\n",
    "y, = layer(x)\n",
    "\n",
    "dsoftmax = jax.grad(lambda x: jax.nn.softmax(x)[0])\n",
    "dlayer = jax.grad(lambda x: layer(x)[0][0])\n",
    "\n",
    "print('=== Softmax forward pass')\n",
    "print('jax.nn.softmax: ', jax.nn.softmax(x))\n",
    "print('Convex optimization layer: ', layer(x)[0])\n",
    "\n",
    "print('\\n=== Softmax backward pass')\n",
    "print('jax.nn.softmax: ', dsoftmax(x))\n",
    "print('Convex optimization layer: ', dlayer(x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Elastic-net regression example \n",
    "This example has a similar setup to Section 6.1\n",
    "of [our NeurIPS paper](https://arxiv.org/abs/1910.12430).\n",
    "We are given training data $(x_i, y_i)_{i=1}^{N}$,\n",
    "where $x_i\\in\\mathbf{R}$ are inputs and $y_i\\in\\mathbf{R}$ are outputs.\n",
    "Suppose we fit a model for this regression problem by solving the elastic-net problem\n",
    "\\begin{equation}\n",
    "\\begin{array}{ll}\n",
    "\\mbox{minimize} & \\frac{1}{N}\\sum_{i=1}^N (ax_i + b - y_i)^2 + \\lambda |a| + \\alpha a^2,\n",
    "\\end{array}\n",
    "\\label{eq:trainlinear}\n",
    "\\end{equation}\n",
    "where $\\lambda,\\alpha>0$ are hyper-parameters.\n",
    "\n",
    "We hope that the test loss $\\mathcal{L}^{\\mathrm{test}}(a,b) =\n",
    "\\frac{1}{M}\\sum_{i=1}^M (a\\tilde x_i + b - \\tilde y_i)^2$ is small, where\n",
    "$(\\tilde x_i, \\tilde y_i)_{i=1}^{M}$ is our test set.\n",
    "\n",
    "First, we set up our problem, where $\\{x_i, y_i\\}_{i=1}^N$, $\\lambda$, and $\\alpha$ are our parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_blobs\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "np.random.seed(0)\n",
    "n = 2\n",
    "N = 60\n",
    "X, y = make_blobs(N, n, centers=np.array([[2, 2], [-2, -2]]), cluster_std=3)\n",
    "Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=.5)\n",
    "\n",
    "Xtrain, Xtest, ytrain, ytest = map(\n",
    "    jnp.array, [Xtrain, Xtest, ytrain, ytest])\n",
    "m = Xtrain.shape[0]\n",
    "\n",
    "a = cp.Variable((n, 1))\n",
    "b = cp.Variable((1, 1))\n",
    "X = cp.Parameter((m, n))\n",
    "Y = ytrain[:, np.newaxis]\n",
    "\n",
    "log_likelihood = (1. / m) * cp.sum(\n",
    "    cp.multiply(Y, X @ a + b) - cp.logistic(X @ a + b)\n",
    ")\n",
    "regularization = - 0.1 * cp.norm(a, 1) - 0.1 * cp.sum_squares(a)\n",
    "prob = cp.Problem(cp.Maximize(log_likelihood + regularization))\n",
    "fit_logreg = CvxpyLayer(prob, [X], [a, b])\n",
    "\n",
    "np.random.seed(0)\n",
    "n = 1\n",
    "N = 60\n",
    "X = np.random.randn(N, n)\n",
    "theta = np.random.randn(n)\n",
    "y = X @ theta + .5 * np.random.randn(N)\n",
    "Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=.5)\n",
    "Xtrain, Xtest, ytrain, ytest = map(\n",
    "    jnp.array, [Xtrain, Xtest, ytrain, ytest])\n",
    "\n",
    "m = Xtrain.shape[0]\n",
    "\n",
    "# set up variables and parameters\n",
    "a = cp.Variable(n)\n",
    "b = cp.Variable()\n",
    "X = cp.Parameter((m, n))\n",
    "Y = cp.Parameter(m)\n",
    "lam = cp.Parameter(nonneg=True)\n",
    "alpha = cp.Parameter(nonneg=True)\n",
    "\n",
    "# set up objective\n",
    "loss = (1/m)*cp.sum(cp.square(X @ a + b - Y))\n",
    "reg = lam * cp.norm1(a) + alpha * cp.sum_squares(a)\n",
    "objective = loss + reg\n",
    "\n",
    "# set up constraints\n",
    "constraints = []\n",
    "\n",
    "prob = cp.Problem(cp.Minimize(objective), constraints)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(DeviceArray([[-0.66]], dtype=float32), DeviceArray([0.14], dtype=float32))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# convert into pytorch layer in one line\n",
    "fit_lr = CvxpyLayer(prob, [X, Y, lam, alpha], [a, b])\n",
    "# this object is now callable with JAX arrays\n",
    "fit_lr(Xtrain, ytrain, jnp.zeros(1), jnp.zeros(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# sweep over values of alpha, holding lambda=0, evaluating the gradient along the way\n",
    "alphas = jnp.logspace(-3, 2, 200)\n",
    "test_losses = []\n",
    "grads = []\n",
    "\n",
    "def loss(alpha):\n",
    "    a_tch, b_tch = fit_lr(Xtrain, ytrain, jnp.zeros(1), alpha)\n",
    "    test_loss = jnp.mean((Xtest @ a_tch.flatten() + b_tch - ytest)**2)\n",
    "    return test_loss\n",
    "\n",
    "# derivative of the loss with respect to alpha\n",
    "loss_grad = jax.grad(loss)\n",
    "\n",
    "for alpha in alphas:\n",
    "    test_losses.append(loss(alpha))\n",
    "    grads.append(loss_grad(alpha))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.semilogx()\n",
    "plt.plot(alphas, test_losses, label='test loss')\n",
    "plt.plot(alphas, grads, label='analytical gradient')\n",
    "plt.plot(alphas[:-1], np.diff(test_losses) / np.diff(alphas), label='numerical gradient', linestyle='--')\n",
    "plt.legend()\n",
    "plt.xlabel(\"$\\\\alpha$\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# sweep over values of lambda, holding alpha=0, evaluating the gradient along the way\n",
    "lams = jnp.logspace(-3, 2, 200)\n",
    "test_losses = []\n",
    "grads = []\n",
    "\n",
    "def loss(lam):\n",
    "    a_tch, b_tch = fit_lr(Xtrain, ytrain, lam, jnp.zeros(1))\n",
    "    test_loss = jnp.mean((Xtest @ a_tch.flatten() + b_tch - ytest)**2)\n",
    "    return test_loss\n",
    "\n",
    "# derivative of the loss with respect to lambda\n",
    "loss_grad = jax.grad(loss)\n",
    "\n",
    "for lam in lams:\n",
    "    test_losses.append(loss(lam))\n",
    "    grads.append(loss_grad(lam))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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K/nP//xP5s2bxwUXXEB9fT0Af//73zn//PNZsGABS5cuTbzfSVtbG9OnT0/Y7PP5mDZtGi+99BKffPIJN998M/PnzycYDHLppZeyeXO8iNfrr7/OOeecw7x587j88suJRqN89NFHLFq0iAULFrBo0SJ27drVr5b29nauv/565s6dyw033MD555+fOH9lZSX3338/559/Pps2beKhhx5i4cKFzJkzh9tuuy0x4v/kk0+YN28eF154Ib/5zW8S5+466g8EAtxyyy0sXLiQBQsWsGbNGiD+CePaa6/ly1/+MmeccQb33nsvEC/bGwwGmT9/Pt/61rf6tN9oOcKD1ZtNUyhG8zGYeeCaptQ9/vjjrFu3jrVr1/LEE0/Q3NwMxIPUGWecwdtvv82cOXP4/e9/D8CsWbP45z//yVtvvcXSpUt57LHHup0vPz+fs88+m3/84x8AvPjii1x66aVcfvnlTJ8+nVWrVrF+/fpuqUWNjY3cdtttPP3007z99tv87ne/w2KxMGnSJF555RXeeust7r77bn784x/3q+W3v/0thYWFbNiwgTvuuINPP/000RYIBDjxxBN5/fXXmTVrFjfddBNvvPEG7777LqFQiNdeew2AW265hZ/85CcJ+3vjkUceYf78+bzxxhusXr2ae++9l0AgAMCWLVt48skn2bBhA3/961+prq7m3nvvxe12s379ep544ok+z2u0FLPB6s2mKRSj+Ri00zys0hz+XjFHk/NeVPtuv+2rVq3ilVdeAeDQoUPs2bOH4uJiHA5HoibKtGnTePPNNwGoqanhhhtuoK6ujmg0ypgxY4465zXXXMPjjz/OJZdcwjPPPMNPf/rTfm348MMPmTNnDmPHjgXi1ctisRg+n48VK1awZ88ehBADpha+//773HzzzUC8LO1JJ52UaLNarSxZsiTx+u233+axxx4jGAzS2trKlClTmDNnDl6vl7PPPhuAr371q7z++utHXWfdunW8+uqr/PznPwfitR6qq6sBmD9/fqI8wuTJk6murua4447r1+5OzA0djkZKSV1b9gRwo/kYtNOsmxG4VmzYsIG33nqL1157jbfffptTTz2VcDg+32i32xMpW1arNTFvfNddd3HTTTfxzjvv8MgjjyT6d2XWrFkcOHCAd955B1VVmTp1ar92SCmPSg9TFIUHHniAuXPn8u677/Lss88O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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.semilogx()\n",
    "plt.plot(lams, test_losses, label='test loss')\n",
    "plt.plot(lams, grads, label='analytical gradient')\n",
    "plt.plot(lams[:-1], np.diff(test_losses) / np.diff(lams), label='numerical gradient', linestyle='--')\n",
    "plt.legend()\n",
    "plt.xlabel(\"$\\\\lambda$\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAFiCAYAAAAA31clAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3Xd8VfX9x/HXuTN7DwKEhE3CRqtsUZy4FRkKitTWWrWIthZ/pQKuVmvd1arFKi7ACSIKDqYMKygzBAgkkJ2bcW/mzTq/PxCEACGXnJv7TfJ5Ph59PMQ7zufw9qTffM/3fD+arusIIYQQQogzM/m6ACGEEEKI1kIGTkIIIYQQTSQDJyGEEEKIJpKBkxBCCCFEE8nASQghhBCiiWTgJIQQQgjRRJaWOMjq1at1u93eEodqM3RdR9M0X5chjiOZqEcyUZPkoh7JxDMVFRWOsWPHRp/qtRYZONntdvr06dMSh2ozHA4HUVFRvi5DHEcyUY9koibJRT2SiWe2bt2acbrX5FadosrLy31dgmhAMlGPZKImyUU9kolxZOCkqA4dOvi6BNGAZKIeyURNkot6JBPjyMBJUbm5ub4uQTQgmahHMlGT5KIeycQ4LbLGSXjOarX6ugTRgGSiHslETZKLejzNRNd1ysrKaOv9bDVNIygoyKOF8zJwUlRoaKivSxANSCbqkUzUJLmox9NMysrKsNvt2Gw2L1WkhurqasrKyggODm7yZ+RWnaIcDoevSxANSCbqkUzUJLmox9NMdF1v84MmAJvN5vGsmgycFCW/salHMlGPZKImyUU9kolxZOCkqOrqal+XIBqQTNQjmahJclFPa8vE6XQyf/58jz83YcIEnE6nFyr6hQycFFVZWenrEkQDkol6JBM1SS7qaW2ZnG7gVFdX1+jnFi9e7PXZNVkcrijZc0M9kol6JBM1SS7qaW2ZzJs3j/T0dEaPHo3VaiUwMJDY2Fh27NjBpk2bmDJlCllZWVRVVXHnnXcybdo0AAYOHMi3335LeXk5N910E0OHDuX7778nLi6Od999F39//2bXJjNOipI9N9QjmahHMlGT5KKe1pbJnDlzSExMZO3atcybN4+tW7cye/ZsNm3aBMCLL77IqlWr+Pbbb3nttdcoKio66TsOHDjAHXfcwcaNGwkNDeWzzz4zpLY2M+Pk2rWP4KTuaKa2MRZsD08ztDaSiXokEzVJLuppTiaX/udHAyv5xco7Bjf5vUOGDCEhIeHYn1999VU+//xzALKyskhLSyMiIuKEzyQkJNC/f38ABg0axKFDhwyouo3MOFVm5rLpqt+y6crfUrJ1l6/LMYQne0qIliGZqEcyUZPkop7WnklAQMCxf16/fj1r1qxhxYoVrFu3jgEDBuB2u0/6zPGDRZPJRG1trSG1tIkZp8rDOVhDgnH+uJtN435Dxwnj6D37Luwxkb4u7awVFhYSFBTk6zLEcSQT9UgmapJc1NOcTDyZGTJKUFAQZWVlp3zN5XIRFhZGQEAAe/fu5YcffmjR2trEjFPEsMGM+u59ut47Fc1mJXvxctYOn8jBl9+jvrrG1+WdlfDwcF+XIBqQTNQjmahJclFPa8skIiKC888/n+HDhzNnzpwTXhs7diy1tbWMHDmSJ554gnPPPbdFa9Naog/Nxo0b9T59+nj9OADlBzPZM+cFClauByCgexeSHplB9NhhLXJ8o+Tl5REbG+vrMsRxJBP1SCZqklzU42kmLpeLkJAQL1akjlOd69atW7eMHTv2lCOyNjHjdLzArp05Z8FTnPPeMwT26EJF2iG23PIAW6b8kfIDh31dXpNVVVX5ugTRgGSiHslETZKLeiQT47S5gdNR0RcNZcS3b9N7zj2YgwIo+HoD6y+4hdTHXqa2rNzX5Z1Ra9tzoz2QTNQjmahJclGPZGKcNjtwAjDZrHS962ZGb1hEp0lXotfUcvCld1g3YjLZH37pcWO/ltTa9txoDyQT9UgmapJc1COZGKdND5yOssdE0v+5vzB0+X8IHdIXd56D7fc8wuar78T5U4qvyzslPz8/X5cgGpBM1COZqElyUY9kYpx2MXA6KmxIMkOXvUr/52dji46g5IedbLziDnbe/zfcBSfvOupLRmwLL4wlmahHMlGT5KIeycQ47WrgBKCZTHSaOI7RGxbR9fe3oFnMZL73GetGTCL9tUXU1xizQVZzFRcX+7oE0YBkoh7JRE2Si3okE+O0u4HTUZbgQHo/fDcjV79D1EXDqHWVsefh5/nuoltxrPne1+URGdl6N+9sqyQT9UgmapJc1NPaMnE6ncyfP/+sPvvKK69QUVFhcEW/aLcDp6MCu3fh3Pf+yZC3/0FA186U70vnh4n3sfX2WVRkZPmsrtLSUp8dW5yaZKIeyURNkot6WlsmzRk4/fvf/6aystLgin7RJlquGCHmkhFEjf4V6a8vJu3ZN8n/Yi2ObzeReNdkut17K5bAlr0/XF1d3aLHE2cmmahHMlGT5KKe1pbJvHnzSE9PZ/To0YwZM4aoqCiWLFmC2+3myiuv5KGHHqK8vJzp06eTnZ1NXV0df/zjHykoKCA3N5drrrmGyMhIli5danhtMnA6jsluo9s9U+g4/jL2PvYK2R9+yYHn3iJr0XJ6P3w3cdddgqZpLVKL7LmhHslEPZKJmiQX9bS2TObMmUNKSgpr167l22+/ZenSpXz99dfous7NN9/Mhg0bcDgcdOjQgUWLFgG/7AD+8ssvs3TpUq/dnpSB0yn4dYhmwEsPEz/telL+71lc2/ew/a65HH7zE5Ieu4+Q/r29XkNubi4JCQleP45oOslEPZKJmiQX9TQnky87DDe4miMuz93QpPetWrWKVatWccEFFwBQXl5OWloaw4YN4+GHH2bu3LlcdtllDBvWMq3VZODUiPBz+zPsy/+QtXA5ex9/meLN29hw6XTip15Lzz//FltkmNeOLY+OqkcyUY9koibJRT2tORNd15k5cybTpk076bVVq1bx1Vdf8cgjj3DhhRfy4IMPer0eGTidgWYy0fnmq4i98gL2P/MGh+Z/yOEFn5Kz5Bt6/ukO4qddj8li/F+jzWYz/DvbimyXmydXp+OqqiXEz8KsMYnEhdi9flzJRD2SiZokF/U0J5OmzgwZKSgoiLKyMgAuuuginnjiCcaPH09QUBDZ2dlYrVZqa2sJDw9nwoQJBAYG8v7775/wWblV52PW0GCS5s0g/pZrSXn4OQpXf0/K7Gc5/M4Skh67j8iRp2yifNacTidhYd6b0WrNnlydzk+pB9n51K3odbW83ch7x4wZw8cff2zIcSUT9UgmapJc1NPaMomIiOD8889n+PDhXHzxxYwfP57LLrsMgMDAQF599VUOHDjAnDlzMJlMWK1Wnn76aQBuu+02JkyYQGxsrFcWh2st0a9t48aNep8+fbx+nJai6zr5K9axZ84LVGZkAxB75Rh6z7mXgC5xhhyjvLycwMBAQ76rrbl98S6yXL88IdIpxMZ/J/T1+nElE/VIJmqSXNTjaSZHF1q3B6c6161bt24ZO3bsKWdE2v0+TmdD0zRiLx/NyDXv0vOhOzH7+5H3+WrWj57Mvqf+Q11FVbOP4XQ6Dai0bQrxszT6Z2+RTNQjmahJclGPZGIcGTg1g9nPTvcZtzHqu4XE3XAp9VXVpD3zButGTSZ36bc0ZzavpqbGwErbllljEkmOCaBTiI2kmABmjUlskeNKJuqRTNQkuahHMjGO3KozUPHmbaTMfhbXjr0AhA8bTPLjMwlO7uHxd7ndbux27y94Fk0nmahHMlGT5KIeTzORW3Vyq65FhJ8/kGFfzqfvPx7EGhFK8cYf+e7iaeye9TTVRZ5Nk+bm5nqpSnG2JBP1SCZqklzUI5kYRwZOBtPMZuKnXsfoDYtIuOMmNE3j0Jsfs27ERA69+TF6XV2TvkcWVqpHMlGPZKImyUU9nmaiaVqra9NyNqqrqz3uCNLsVbWapsUDC4AOQD3wmq7rzzf3e1s7a1gISY/NpPMt15Dy1+coWr+F3bOe5vCCT0l6bCYRwwc3+nmz2dxClYqmkkzUI5moSXJRj6eZHN0Lqaqq+Q87qUzTNIKCgjz6jBGPI9UCD+i6vlXTtGBgi6ZpX+m6vtuA7271gpO686sPXiBv+Rr2zHmB0t37+f6Gu+lw7Vh6P3wP/p1iT/k5l8tFeHh4C1crGiOZqEcyUZPkoh5PM9E0jeDgYC9W1Ho1+1adrus5uq5v/fmfS4EUoFNzv7ct0TSNDleOYdS69+nx4G8w+dvJXfIN60ZOYv8z/6Wu0n3SZ6Kjo31QqWiMZKIeyURNkot6JBPjGLrGSdO0RGAwsNnI722KjOLKZj3+3xLM/nZ63H87o9a9T4drxlJf6Wb/U6+zfvTN5H6++oT6i4qKfFipOBXJRD2SiZokF/VIJsYxz50715Av0jQtCPgC+Iuu6z8d/9rWrVvn3nzzzSxYsID58+dTUlLCkCFDyMrKora2FrfbTX5+Pjabjby8PJxOJ3a7naysLOrq6qisrKSgoAA/Pz9ycnIoLS3FYrGQnZ2NrutkOlzcs+wg6w+WUOEqJoQqLGYzOTk5wJEpSofDgb+/P1lZWVRWVqJpGjk5OZhMJkpKSigsLDz2utvtpr6+ntzcXCwWC4WFhRQVFR17vbq6mpqaGvLy8rBarTgcjhNeP9M5aYH+hF48FEv/HtSmZVJx4DC5S7+hcOOPVMSEYgoLpri4mPLy8mPfWVFRgclkUvacmpJTeXk5BQUFrfacsrOzqa6ublPn1BZyslgsbe6cWntOtbW1lJeXt6lzau051dXV4XK52tQ5eTOnysrKnG7dur12yvGOEbM0mqZZgWXACl3Xn2n4urf3cdqWXcrfVqVTVFkLQGyQjfH9Y7isdyR+FrUfHKyvrSXznaXse/I1aopdaGYzXW6/gc73TiE4VqZWVVJVVYWfn5+vyxDHkUzUJLmoRzLxjFf3cdKOPMc3H0g51aCpJQzsGMyCiX25b2Q8nULs5JVV86+NmUxduIt3tubgqqr1RVlNYrJY6DLtBkZ9t4gu025A13Uy/vMBmy6YwuG3P23y9gXC+/Ly8nxdgmhAMlGT5KIeycQ4RkzHjACmAhdpmvbTz/8bZ8D3esRmMTGuTxT/GZ/Ew2O70js6AGdVLQu25nLLwl28sjGT/DJ196SwRYSS/Pc/MuLrNwkfNpi6klJ2/ekpNl7+a4q/3+7r8gR4/Miq8D7JRE2Si3okE+M0ezsCXdfXA57tHuVFZpPGyK5hjEgMZXtOGYu25/FDZimf7Cpgye4CLuwezoQBsXSN8Pd1qacUnNyD8z5+if3vLSHrmbdw7djL5mt+R9wNl9L7r3fjFye374QQQghfUXsBUDNomsbAjsE8cXkPXrm+Nxd2P7J/xTf7i7nz4z3MXpHG9pwyJZ/E0zQN28jBjFr3Pt3vn47JbiPn45WsGzGJtOffoq7q5O0LhPeVlZX5ugTRgGSiJslFPZKJcdpVk9/cUjcf7Sjgy1QH7roj550UE8CEAbEMSwjF5OG26950/EK+ioxsUh95ibzPVwPgn9CRpEdmEH3pSI+3ihdnTxZXqkcyUZPkoh7JxDPS5PdnHYLt3D28M+9M7seUwR0ItptJya9g3tcHuePDFL5ILaS6rt7XZQJQUFBw7J8DEjoyeP4T/OqDFwjq3ZXKjGy23vZnfpg8k7K96b4rsp05PhOhBslETZKLeiQT47SrgdNRoX4Wbj0njncm9eWuoZ2ICbKS6XTz7LpD3LZoN4u351Fe7dun2U41kxQ56lyGf/0WfR67D0toMIWrv+e7i6aSMud5alwyDettMrunHslETZKLeiQT47SrW3WnU1uvszqtmA+253Gw+EhDw0CbmauSori+bzQRAdYWr6miooKAgIDTvl7tKGbvk6+R+c5S0HVsUeH0+r+76DRpHJqpXY6Hve5MmTRVtsvNk6vTcVXVEuJnYdaYROJC7AZU2P4YlYkwluSiHsnEM3Kr7gwsJo2Le0bw7xv68Nhl3RjQIYjy6joWbctj6qJdPLf+EFnOlu0QfaZpVVtUOP3+8WeGrXiDsPMGUO0oZuf9T7Bp3G8o2bKzhapsX4yY6tZ1nSdXp5OSX0GWq5qU/AqeXJ3e/OLaKbn9oCbJRT2SiXEMa7nSmMzMzLlRUVFeP05zaZpGp1A/Lu0VybmdQyitqiWjuIp9jkqW7naQXlxFh2AbUYE2r9ei6zr+/mfeMsEvNopOk64ksHsXSrbuonx/BpnvfUZFRjah5/TFEiS/YRilqZmczsGDB+nevTvbP51PVWEO4f1GAmAza1zXN8aoMtuV5mYivENyUY9k4pmcnJzTtlyRGafTSIoJZM4l3fjP+CQu7xWJxaSx7mAJ9y7Zy58+38cPmS6vbmVQ58GO4Zqm0fGGSxm1/n26zbgVzWYl+4MvWDd8Egdeeod6t7obf7YmnmRyKl27dqWoqIipb26k26RZx/59iF+zt1Nrt5qbifAOyUU9kolxZOB0BvFhftw/ugsLJvZlwoAYAqwmtuWU8X9fpvH7T1NZlVZEXb3xA6jy8nKPP2MJDKDXQ79j1Np3ibl8FHXlFex97GXWXziVgq83GF5je3M2mZzKrDGJJMcE0CnERlJMALPGJBryve2RUZkIY0ku6pFMjCOLwz1UXl3HshQHn+zMP9ZUuEPwkabCl/Yyrqmw2+3Gbm/egmHH6s2k/PU5yvdlABA9dhh9HplBYPcuRpTY7hiRiTCWZKImyUU9kolnZHG4gQJtZiYOjD2hqXBuaTUvbTC2qXBubm6zvyNqzPmM+PZt+sz7A5bgQAq+2cj6MVNIffRf1JbJbx+eMiITYSzJRE2Si3okE+PIwOksHd9U+K9eaCpstRqzBYLJaiHxzkmM2rCIzjdfjV5bx8F/vcu64ZPIWvwFer0aG362BkZlIowjmahJclGPZGIceaqumUyaRkK4H1f0jmRAXBDFlTUcLnGzp6CCJbsKyHa56RhiJ9zfs/9oTSYTNptxT+9ZAv2JuWwU0WOHUbonjfL9GeR/sRbHqs2EJPeQ5sFNYHQmovkkEzVJLuqRTDwjT9W1AE3TGNSgqbAOfH2WTYUdDodX6gwdnMzQz16l/4t/xR4TiXPrLjZecQc7Zj6Bu6DIK8dsK7yViTh7komaJBf1SCbGkRknL4gIsDKqaxgX94ygXtdJL6rkUImblfuK2JLlIsRuoXOo/Yxb4HurIaOmaYT07Un81GvR63WcP+7GtW0Pme8sQbNZCR3QB81s9sqxWztpkqkeyURNkot6JJOmkxknHznSVDietyf1Pamp8G8+TOHLRpoKV1d7f+8lS1AgvWf/npFr3iX64uHUlpaTOvdFvht7KwWrNnn9+K1NS2QiPCOZqElyUY9kYhwZOLWAMH/rSU2FDzvdPNNIU+HKysoWqy+wWzznvPM057zzNAHd4infl8GWyfez9bYHqUjPbLE6VNeSmYimkUzUJLmoRzIxjuzj5ANNaSrsqz036qtryHh9Mfuf+S915RVoNitdfzeZbjNuxRLYvtu3yD4o6pFM1CS5qEcy8Yzs46SYhk2F+5+iqfC2tCyf1GayWel69y2M2rCQjhPGoVfXcOCFBawbMYnsj1Z4tc2M6mQfFPVIJmqSXNQjmRhHBk4+pGka58WH8s+revL8Nb0YkRBKbZ3O8j2F/HWDk0e/OUhqgW82qvSLjWLAC7MZuvx1Qgcl4c51sP3ueWy+9i6c21N9UpOvyaO86pFM1CS5qEcyMY48VaeI6EAbY7qHM6ZbONW1OunFlaQXV/FFaiHbc8qICLASF2w745N4RvOLi6HzzVfj37kDJVt2Ur4vg8x3llKVW0DYkL6YA9pPt21N0+SHj2IkEzVJLuqRTDwjT9W1IkebCv9tRBg39W+5psKN0UwmOk++ilEbFpH4u8loZhOZ7yxl7fCJpL++iPqa5reYaQ0KCwt9XYJoQDJRk+SiHsnEODLjpKgAm5nh3aO5KimKQLuZ9OIqsl3VrE938s3+IswmjYRwfyymlpuBMtttRI05nw5XX0RFeiZlqQdxrNpM3uerCejehYCETi1Wiy+YTCZZXKkYyURNkot6JBPPyIxTK3T00dEgu4VJAzvw9umaCv+Ya0hTYU8E9UzknPeeYciCpwhI7ETZ3oP8MGEGP05/iIqM7BatpSXJ47zqkUzUJLmoRzIxjgycFFVVVXXCn0/bVHhLDlMMaCrsKU3TiLl0JCPXvEuvv/wOc4A/ecvXsH70zex78nVqy9vWRZrtcvPp9ixuX7yLGUtTyXG5fV2S4OTrRKhBclGPZGIc2cdJUWfac0PXdbbllLF4ex4/ZJYCYNbgwu7h3DQglq4RLbtouyqngL2Pv0z2hysA8OsYQ++H76HDtWNbfEG7N8xYmsrhojLKao/8rpEcE8Bz1/T2cVVC9qZRk+SiHsnEM43t4yQDJ0VlZGSQkJDQpPemFVaweHs+aw4Uc3Td+PnxIUwYGEu/2MAWHbgUf7+dlNnP4vp5y4LwoYNIenwmIX17tlgN3nD74l0k1ufzwr2T0OtqGn1vVlYW/v7t52lDX/LkOhEtR3JRj2TiGRk4tUJ5eXnExsZ69JmcUjcf78jny9RC3HVHck2OCeSmATEMSwjF1EIDKL2ujsyFn7P38X9TU1QCJhPxU6+l559/iy0itEVqMNqMpanY3E62Oa0AJMUE8LzMOPnc2VwnwvskF/VIJp5pbOAkT9Upqr6+3uNp1WC7hfPiQxnXJxK7xcTB4kqyXG7WHChhzYFi7BYTXcL9MHv5STzNZCJ0QG/ip1xDfXUNrh9TcP64m8x3l2IOCCCkfy80U+taXjcoLphduaXUaRY6h9qZNSaRYLvF12W1e2dznQjvk1zUI5l4prGn6mTGSVFGTKtW1tTxZWohH+3MJ7/syO2lyAArN/SLZlyfKAJtZiNKPaOy1IOk/PU5Ctf+D4CgpO4kPTaTyBFDWuT4RpGpbvVIJmqSXNQjmXhGZpxaIYvF0uxdXq1mE0kxgVyTHE2nEDtZLjc5pdVszSplWYqDiuo6EsL98Ld6dwBliwqn4/jLCenXE+fW3VSkHSJ78XLKUg8SOjgJa2iwV49vFCMyEcaSTNQkuahHMvGM7OPUCpWWlhr2XUebCr/aoKnwwuOaCmc5vfuoqqZpxF5xASPXvkfPP/8Gk7+d3M++Zd2oyex/ej51leo/3m9kJsIYkomaJBf1SCbGkYGToqqrjd+TqWFT4eHHNRWe/kEKj35zkL0FFYYf93hmfzvdZ97OqPUL6XDdxdRXVbP/6fmsGzWZ3M++pSVuHZ8tb2QimkcyUZPkoh7JxDiyxklRLbXnxqGSKj7Ynsc3+4up/Xkvg0Edg5gwIJZzOgV7fSuDoo0/kjL7OUp37QMgYsQQkh6bSXBSd68e92zIPijqkUzUJLmoRzLxTGNrnGTGSVG5ubktcpwuYX48MDqBtyf2PdZU+KfslmsqHDFsMMNXvkHyk3/CGh5C0Xdb2XDxNHb/3zNUF7u8dtyz0VKZiKaTTNQkuahHMjGODJwU1dIbKEYGWvnN+Z14Z1Jfpv8qjnB/C2mFlfxtVQa3f7CbpbsLqKqt98qxNbOZLrddz6gNi+ly+43ous6hNz5k3YiJHFrwKXpdnVeO6ynZ1FI9komaJBf1SCbGkYGTonz19MPxTYVnjIynYws2FbaFh5D8twcY8fWbRAwfQk2Rk90PPsWGy6ZTvHmbV47pUX3yRIpyJBM1SS7qkUyMIwMnRTmdTp8e32YxcWWfKOb7oKlwcHIPfvXRiwx6/TH8OsVSunMfm6+9i213zaEqO98rx2wKX2ciTiaZqElyUY9kYhzZx0lRVqtVid8QTJpGQrgfV/SOZEBcEMWVNRwqcbOnoIIluwrIdrnpGGIn3N9q6HE1TSOod1fip16HZjHj/HEXpTv3cXjBp4BO6KAkTJaW3blblUxUl+1yM3tFGou35bEqrZhBccFe22VdMlGT5KIeycQzsnN4K5SdnU3Hjh19XcYp+aKpcOXhHPbMe4m8ZasA8O/SkT7z7iXm8tEt1sRY5Uy8YePGjbz77ruYPGyPszGjhPpO/YgccgkAyTEBPOelvn7tLZPWQnJRj2TimcaeqpNmW4qqqanxdQmn1T0ygIcuTGTauXHHmgpvPuxi82EXyTGBTBgYw9AuxjYV9o+PY/B/Hqdw/RZSZj9L2Z4D/Hj7Q0Re8CuSHp1JUK9Ew451Oipn4g1RUVEMHDjQ44HT9toc3OG/NBN1emlNHLS/TFoLyUU9kolxZMZJUa1pz42SyhqW7nawZHcBpe4jT8DFh9q5aUAsY3uEYzUbu5SuvraWw299yv5/vE5NSSmaxUyX6ePp8cB0r7ZvaU2ZGCnb5ebJ1em4qmoJ8bMwa0wicSGn/3uYsTSVlPxfNlJNigngeS/NOLXXTFQnuahHMvGM9KprhbKysggLC/N1GU3iZzUzsGMw1yRHEe5vIaO4ipzSajYecrJibxG6rpMY7o/NoAGUZjIRNiSZzpOvprasAudPKTi37CTr/WVYw0MI7tvTK7fvWlMmRpq9Io2U/ApK3XU4ymvYW1DO5b1Pfz0Pigtmb0E5NrNG51A7s8Ykem2NU3vNRHWSi3okE8/IGqdWyOFw0FoHm7X1OqvTilm8PY/04iM98AJtZq5OiuL6vtGEBxi7kNy1cy8ps5+leNORLQtCBvQh6fGZhP+qv6HHac2ZnE5eXh5JSUlnfJ9fTBf63j8fzWSiU4iN/07o2wLVnVlbzKQtkFzUI5l4RtY4tUJms9nXJZy1o02Fx/YI53+ZLhZty2dHbhkLt+Xx0c58Lu0Zwfj+sXQKNWbaOKRfL8775GVyl3zNnnkv4dq+h81X30nH8ZfRa/bv8esQbchxWnMmpxMbG0tRUVGj72l46y3ET50fG20xk7ZAclGPZGIc2cdJUS6XWu1GzsapmgrX1Ol8vqeQ6R/sNrSpsKZpxF13CaPWL6T7zGmY7DayP1zBuuGTOPDi29S7m7/nVFvI5GzMGpNIckwAnUJsJMUEMGtMoq9LOqa9ZqI6yUU9kolx5FadoioqKggICPB1GYZrqabCFRlZpM57ibzlawAI6NpoUmxbAAAgAElEQVSZPvNmEH3J8LM+RlvNpDWTTNQkuahHMvGMNPlthc50+6S1aqyp8N2fprIqrdiQpsIBCZ0Y/MbfOHfRcwT2TKTiYCZbb/0TW275I2X7M87qO9tqJq2ZZKImyUU9kolxZOCkqJaYCfSlUzUV3l9Yyd9WpRvaVDjqgvMY8e0C+jw6A0tIEI5vN/LdmCnsmfcStaXlHn1XW8+kpWW73MxYmsrti3cxY2kqOS63x98hmahJclGPZGIcuVWnqKqqKvz8/HxdRouprq3nq/1FfLA9n+yf/w801M/CtX2juSYpypAFye6CIvb9/VUy31sGuo4tOoJef7mLThOuQGvCJo/tLZOm+Oqrr5gyZQpWq+dPSlbX1lOvaSTd8zL+sV3OaodxyURNkot6JBPPNHarTgZOisrIyCAhIcHXZbS4unqd7zJKWLwtn72OIwvH/SwmrugTyY39YogJan6vJee2PaT85RlKftgJQOjgZJIev5+wIcmNfq69ZtKYmpoa3G7PZ4oA7vo4hezSGkxW+1lvcyCZqElyUY9k4hnZjqAVCgoK8nUJPmE2aYzuGs6oxDC25ZSxeHseP2SW8snOApbuKuDCHhHc1D+GrhH+Z32M0IF9OP+zV8n5eCWpj/wL54+72TTuDjpNHEevv9yFPSbylJ9rr5k0xmq1ntVsE0BEWAh51c3b5kAyUZPkoh7JxDiyc7iiKisr2/UTEJqm0SHYztgeEQxPCKWipp704irSCitZluJgb0EF0UE2YgKtZ/WUnKZpBCf3IH7qNeg6OH9KwbU9lcNvL8FksRA6sA9ag31P2nsmRjvVDuOl7jpmr0hj8bY8VqUVMyguuNFdxyUTNUku6pFMPCM7h7dCMq16spxSNx/tyGdFaiHuuiP/3RrVVLj8YCZ75rxAwcr1AAR070LSIzOIHjvs2HskkzPLzc1lx44dZ/35VzdnkVPrT2DnXgBnXPckmahJclGPZOIZWePUCslCvtMrqaxhyW4HS49rKtwlzI+bBsRwUffmNRUu+HYTex5+jvL9hwCIvmQEfR6ZQWDXzpJJE6xcuZKXXnrprHcp3pVXhiWuN52v+DXAGdc9SSZqklzUI5l4xusDJ03T3gCuAvJ1Xe/X8HUZOHnu8OHDxMfH+7oMpVXW1PFlaiEf7sinoLwGgMgAKzf0i2ZcnygCbWf3f9711TVkzP+A/f98g7qyCjSblcTfTsQ+/mIS+/Qy8hREAw3buyTFBPB8IzNOcp2oSXJRj2TimZbYAPNN4HKDvkuAYTtot2X+VjPX94vhrYl9efCCBBLD/SisqOH177OZsnAXb/wvm+KKGo+/12Sz0vWumxm9YRGdJl2JXl3DwZfeYf/4mWR/+KXsh+JFnrZ3ketETZKLeiQT4xh2q07TtERgmcw4GUO2x/ecrut8f9jFou157Mw9srml1aw1u6lwydbdpMx+FufWXQCEnduPpMdmEjooybDaxdmR60RNkot6JBPPSMuVVqigoMDXJbQ6mqZxfpdQnrmqF89dbVxT4bAhyQxd9ipxD/8OW3QEJT/sZOMVd7Dz/r/hLpA2Br4k14maJBf1SCbGMWw7gnnz5oUBN8+dO/flhq9t3bp17s0338yCBQuYP38+JSUlDBkyhKysLGpra3G73eTn52Oz2cjLy8PpdGK328nKyqKuro7KykoKCgrw8/MjJyeH0tJSLBYL2dnZ6LpOeXk5BQUF+Pv7k5WVRUVFBSaTiZycHOBIV2iHw3Hs9crKSjRNIycnB5PJRElJCYWFhcded7vd1NfXk5ubi8ViobCwkKKiomOvV1dXU1NTQ15eHlarFYfDccLrRpyT2+3G6XS2qXNqyZyqS/IZ3jmQUQkhlFW6yS6vI724iuWphWzLdlFbVkKYpY7q6uqmnZO/PxWRwUTfdBl+NhuubXtwbdvD4XeW4KooJ2xQMtk5OZJTC59TYWEhmqa1qXNqCznZ7XZKSkra1Dm1hZwcDkebOydv5VRZWen97QjkVp2xHA4HsveVcRzl1Xy8s4DlexxU1Bzpgdcj0p+bBsQyumsYZtOZ7/8fn0l52iFS/vo8jm83AhDYM5Gkx+4j6oLzvHcS4iRynahJclGPZOIZuVXXCpWXe9aAVjQuKtDGb8/QVNh9hqbCx2cS2L0L5773T4a8/Q8CunamfF86P0y8j623z6IiI8vbpyN+JteJmiQX9UgmxjFqO4L3gTFAFJAHzNF1ff7R12XGyXNutxu7/ewWM4szO5umwqfLpN5dTfpri0h79k3qKiox2W0k3jWZbvfeiiXw7FvDiDOT60RNkot6JBPPeH3GSdf1ybqux+m6btV1vfPxgyZxdnJzc31dQptms5i4sk8U88cnMXtsIr2iAnBW1bJgSw5TFu7ilU2Z5JdVn/CZ02Vistvodu9URm1YSMfxl1PvrubAc2+xbuQksj9ZKdsXeJFcJ2qSXNQjmRhHbtUp6mwbpwrPHG0q/OK1vXhyXA/O7RxMVW09n+ws4LZFu3hqTQbpxZXAmTPx6xDNgJce5vxlrxIyoA/unAK23zWX76/7Pa4dqS1xOi0m2+VmxtJUbl+8ixlLU8n5edaupcl1oibJRT2SiXGk5YqiysvLCQwM9HUZ7VJaYQWLt+ez5kAx9T9fHufHh3BN71B+ldi0xZV6fT1ZCz9n7+OvUF1YAppG/NRr6fnn32KLDPNi9cYrLS3F4XCcsIHeI18fIK2wEktwOGab/xl7ynmLXCdqklzUI5l4prFbdadvOy58yuFwyH/kPtI9MoCHLkxk2rlxfLQjny9TC9l82MXmwy6SY4qa1FRYM5nofPPVxF45hv3PvMGh+R9yeMGn5Cz5hp5/uoP4addjsrSOy+/zzz/nscceO6H/nKO8hjpdp8sN9xHW+zycVbU+qU2uEzVJLuqRTIwjM06KKikpISysdc1MtFVHmwp/ujOf8p+3MvC0qXBZ6kFSHn6OwjX/AyCoTzeSHruPyJGn/IVGeZ72lPMWuU7UJLmoRzLxTGMzToZtgNmYzMzMubJ/hGdcLpf8dqAIP6uZQR2DGR4DnSJDySiuIqe0mo0ZTlbuLULXdRLD/RsdQNmiwuk4/nJC+vfCuXU3FWmHyF78BaV7DhA2OBlraHALnlHzDYoLZm9BOTazRudQO7PGJBJsb/kZNLlO1CS5qEcy8UxOTs5pN8BsHfcK2qHKykpflyAa0GvcXN8vgauTo1mdVszi7XmkF1fx2vfZvPdTHlcnRXFd32jCA069CFPTNGIvH03UmPNJf3UhB557i7xlqyj4+ju63j2FbndPwRzg18JndXbiQuw+WdPUkFwnapJc1COZGEdu1SlK9txQT8NMmttUuCo7n9RH/0XOJ18B4Ncplj5z7iX26gulk3kTyXWiJslFPZKJZ2Tn8FZI9txQT8NMGjYVHnZcU+Fff7ibx745yF7H6ZsK+3WMYeAr8zjv05cJ7teTqqw8fvrtbP53472UpqR5+3TaBLlO1CS5qEcyMY4MnBRls9l8XYJooLFMkmMDmXdJN/5zYxKX9YrApGmsPVjCPZ+m8ufl+9iS6TrtRpgRQwcxfMUbJD/1INaIUIo2bOW7sbex+6F/Ul3s8tbptAlynahJclGPZGIcWRyuKE3T5D90xTQlk1B/C8MTwrisVwSappFeXMlhp5tv9hez6ZCTAJuZLmF+J21loJlMhA7sQ/wt11BXWYVr2x6cW3eR+d5SLEEBhPTvhWaS33MakutETZKLeiQTzzS2OFx+EiuqsLDQ1yWIBjzJ5Pimwrefe2JT4emNNBW2hoWQ/Pj9DP/6TSJGnkNNsYvds55mw6XTKdr4o5Gn0ybIdaImyUU9kolxZMZJUSaTSRbyKeZsMrFZTPTvEMS1ydFEBdo47HSTU1rN94ddLN9TSE2dTmK4H3bLib/D2KMj6HjTFQQndafk5+0LshYtp2xfOqFD+mINCTLy1FotuU7UJLmoRzLxjMw4tULy6Kh6mpOJzWLiqqSTmwq/1UhTYU3T6HDVhYxa9z49/nQHJn87uUu+Yd3ISex/5r/UVfqmP5xK5DpRk+SiHsnEODJwUlRVVZWvSxANGJFJw6bC53Q6fVPhY5/xt9PjgemMWvc+Ha4ZS32lm/1Pvc760TeTt3zNaRedtwdynahJclGPZGIc2cdJUbLnhnq8lcl+RwWLt+ex9mDJCU2FJw6MpV+Hk2/JFX63lZTZz1L285YFkaPOpc+j9xHcp5vhtalOrhM1SS7qkUw8Iy1XWqGsrCzpK6QYb2USEWBlVNdwxvaIoF7XOVhUyaESNyv2FrEls5QQPzOdQu3HNsUM6BJH5ynXYI+OoGTLTsr2ppP59hJK8ov5Z6E/C3cXsSqtmEFxwT5pg9KS5DpRk+SiHsnEM42tcZIZJ0Xl5eURGxvr6zLEcVoqk6NNhZfuLqDUXQecvqlwdZGT/U+9zqEFn0J9PWVWC+9XHmZ1vZOGV/bll1/Oe++95/X6W5JcJ2qSXNQjmXimsRknGTgpyuVyERIS4usyxHFaOpPKmjq+SC3kox35FJTXABAVYOWGftGM6xNFgM38S2279vHpbx8nJm0vAHlx8eyceDP/mHXtsffU19djamN7Qcl1oibJRT2SiWek5UorVFxc7OsSRAMtnYm/1cwN/WJ4a2Jf/nRBFxLC/XBU1PDa99lMWbiL//4vm+KKIwOqkL492fLgLJZNnI4rNJzYnMOMfe5Jtt09l6qcAoA2N2gCuU5UJbmoRzIxjqxxUpTFYpFdXhXjq0xMmkb3yACuToqid3QABeXVZDrd7MwrZ8nuAhzl1cSH+jGqazgbTaGkDB2J1WYhKv0ApTv3cfjtJaBphA7sg8ni+zVP2S43s1eksXhbXrPXYsl1oibJRT2SiWdkjVMrlJOTQ1xcnK/LEMdRKZPdeeUs2p7HxgwnACYNRiaGMWFgLL2iAgCoyMgm9ZGXyPt8NQABiZ3oM+8PRF868thCc1+YsTSVlPxfmh8nxwTw3DW9z+q7VMpE/EJyUY9k4pnGbtX5/tdPcUrV1dVnfpNoUSplcrSp8KHiKj7Ykcc3+4tZe7CEtQdLGNwxiAkDYhnSJY7B85+gcN0PR7YvSD3I1tv+TNSF59PnkRkE9Uz0ao133HEHH3/88Slf84vpQt/756OZTDiras/6GCplIn4huahHMjGOzDgpSvbcUI/KmTjKq/l4ZwGf73FQWXOkB16PSH8mDIhlVNcwtLo6Dr31Mfv/MZ9aZymaxUzCr2+i+wPTW7x9S8MZp6SYAJ4/yxknlTNpzyQX9UgmnpHF4a1Qbm6ur0sQDaicydGmwu82aCr8xM9NhZftKyZu2nhGf7eQzlOvRa+rJ/3VhawbPpHM95ah15/ccNhbZo1JJDkmgE4hNpJiApg1JvGsv0vlTNozyUU9kolxZMZJUfn5+cTExPi6DHGc1pRJdW09K/cV8eGOfLJdR3rahfpZuK5vNFcnRaHvTSNl9rOUfL/9yGuDkkh6fCZh5/TzZdkea02ZtCeSi3okE8/IjFMrJE8/qKc1ZXJCU+GLEukZ5X9CU+H3KwLp+u7zDHh5Lva4aJw/pbDpyt+y/d5Hqcpz+Lr8JmtNmbQnkot6JBPjyMBJUU6n09cliAZaYyZmk8bobuG8dG3vE5oKf7yzgGmLd/NuZG8SPvsv3Wbcimazkv3BF6wbPokDL71DvVv9xaStMZP2QHJRj2RiHLlVp6jy8nICAwN9XYY4jmqZZLvcPLk6HVdVLSF+FmaNSSQu5MyLP0/XVPjGiDrq/zWf/C/XARDQLZ6kR2YQffFwb55Gs6iWiThCclGPZOIZabnSCmVnZ9OxY0dflyGOo1omM5am8tPedDI/ewVdryfEbmZAXPBp319VVcXrr79OaGgoADkuNx/uyGfF3kKq6478HEiOCeSGykx44TUq0g4BED12GH0emUFg9y7ePykPqZaJOEJyUY9k4hnZx6kVqqmp8XUJogHVMnFV1WLxDya8/ygAwv0tXDu082nfX1tbi5+f37E/x4XYuXdEPFOGdGDJrgI+S3GwO7+c3YSTeO9fuHHf95gWLKTgm4041v6PxN9OpPvMaViCzv631rOdJTsd1TIRR0gu6pFMjCMzToqSPTfUo1omRu6HBKduKty5rpLrN3yBdcU3ANhjIuk1+/d0HH8ZWhN73x2/8d79y/ayJ78CzWxB07Rm7RoO6mUijpBc1COZeEaeqmuFZM8N9aiWiZH7IcGpmwpnmv15cdQNfHLvLKp798KdX8iOPzzKpqvuxPnj7iZ97+jRo4mPjyc+Pp7377yIn+ZeR3XJkcbDzdk1HNTLRBwhuahHMjGO3KpTlCziU49qmcSF2Js1W3M6FpPGJT0jGdsjgu8Pu1i8LY+dxPPSLffSf8f/uPCrpTi37mLjFXfQafJV9Pq/32GPjjjt923atOnYPzecJQvxa96PINUyEUdILuqRTIwjAydFmc1mX5cgGmhvmZg0jaFdQhnaJZRdeWUs3p7PRtP57OkzkGGrv2TIhm/Jen8ZectW0f2B6SRMH4/JZm30O2eNSeTJ1ek4j1vj1BztLZPWQnJRj2RiHBk4KcrlchEeHu7rMsRx2nMmfWODmHdJ0C9Nhf2vZ/s5wxjzxcd0S91J6twXyXxnKUmP3UfUmPNP+z1Gz5K150xUJrmoRzIxjgycFBUdHe3rEkQDkgl0CffjgdEJ3HpOHJ/sjObzuDg67NzOmOUfwf4Mfpg0k+hLR5L0yB8ISDz9E35GkUzUJLmoRzIxjgycFFVUVERAQICvyxDHaclMjH5s32jRPzcVnjwolmUpsSzt14+u337F0FVfULByPfmrNpH4u8n0vO82LIHe+zuT60RNkot6JBPjyFN1imqJbSKEZ1oykydXp5OSX0GWq5qU/AqeXJ3eYsf2RLDdwuRBHXjrloEMnzWd5X99jF2Dz0erqSXjxbdZed4EDiz6wmt/d3KdqElyUY9kYhyZcVKUTKuqpyUzcf38mP6BhX+naOtX/AAsOIvv6dmzJ5s3bza0tlM52lT4it6RfDc2mRWfbqDnu2/TIesQe2c8yvZ/L2bQ3/9I4vl9DT2uXCdqklzUI5kYRzbAVFRGRgYJCQm+LkMcpyUzMXpzy5am6zo/ZrpY+8pHxC9aRGB5KbqmUXTRRQx95Pd07x5nyHHkOlGT5KIeycQzsgFmKxQUFOTrEkQDLZmJ0ZtbtjRN0xgSH8p9T0yn39dvkzfuCuo1jchvvmHH2Cm8/MeX2XG4pNnHketETZKLeiQT48itOiEU5K3NLX2hd9cYer/xVw7+OImtDz1D4E/b6PbOO2xb+Q2f3DKVSyZdyPldQjBpmq9LFUKIM5IZJ0WVlZX5ugTRgGTSPF0H9+SGL16m1+tPUNshlqj8HM579il+uP0hZr62npV7C6mpq/foOyUTNUku6pFMjGOeO3eu1w+SmZk5NyoqyuvHaUv8/PywWGRCUCWSSfNpmkZ470S6T7se3W6neMsuInMy6bp+DZvTCnmzMph6s4XEcD+s5jP/XieZqElyUY9k4pmcnJycbt26vXaq12TGSVEFBQW+LkE0IJkYx+xnp/fMaVy4cREdbrgUS20NQ1d/wdVPPMzq/yxlyvs7+e//simuqGn0eyQTNUku6pFMjCMDJ0Vpst5DOZKJ8fziohn08lzOX/pvgvv3JsRZzFWL3mDcK//kqy+3MGXRLl5Yf5hsl/uUn5dM1CS5qEcyMY7cqlOUxWLBam28YapoWZKJ9/h3iiX+lqvx6xhDyQ+7CMrJZsAP32F3uVjjH8PH+5xkFFcRF2InMuCXDCQTNUku6pFMPCO36lohmVZVj2TiXZrZTPyUaxm9YSEJv5mAyWRi0Pfr+O3zjzBw81rW7i/k7k9T+fPy/WzJdKHrumSiKMlFPZKJcWSlmKJCQkJ8XYJoQDJpGdawEJIevY/Ot1zDnr8+R+G6H7hw6SJGbNvIF5fdyI/04MfsUnpE+nNl9yA61+uYTXIbQiVyrahHMjGOzDgpqq6uztcliAYkk5YV3Kcb5y5+nsFv/A3/+DhsGYe49rVnuWfFu3SqdLG/sJLnvy9g+ge7+Wx3Ae5az7YyEN4j14p6JBPjyMBJUeXl5b4uQTQgmbQ8TdOIHXcBI9e+R88//waTvx3bug1M/udcZuz/jg6WWnJKq3lxQyZTF+7ivR9zKXXXnvF7s11uZixN5fbFu5ixNJWc0yw+F2dHrhX1SCbGkV51inK73djtdl+XIY4jmXgu2+XmydXpuKpqCfGzMGtMInEhnv0dHv8dMRVOrl+3nJLPvwXA3ikW/fe/5qOI7uwrrALAz6JxcbcQruoVRlTAqVcj/PmL/ex1VGG2+wOQHBPAg2MSm12rOEKuFfVIJp5prFedDJwUJQ0Z1SOZeO5os+L6Gje6Xk/fuFBeuL7vGT/3+uuvM3v2bEwmE7X1OvW6Ts/pfyekxyCSYwJ4OLqClNnPUbprHwARI88hbdxFvJBaSHDPcwDQ62px7liD47uPqC44fML3u2vrsUZ2pOe0x9FMGh2CbAT7mdnnqMQSEILJaic5JqDNtL1paXKtqEcy8UxjAydZHK4oeWxUPZKJ51xVtei6Tuq/H6Aiex+maX+BJgycbr/9dqZMmQLAnR+lkF1ajWY+8uPKWVVLxLDBDF/5Bjv/tYD8VxZRtH4LERt/Yv606zFd2JGPMipYk1ZM2KCxhA0aS2XaFlzff0Z19l4A9KpaastK2PPS3QDsM2nU61Cv63S58X7Ck4fhrDrzLT9xanKtqEcyMY4MnBQVGhrq6xJEA5KJ50L8LGiuapLufQmApJiAJn3OYrEcaw8RHhJIbtUvT82F+B3595rZTLdfT6D31BvZ/9TrHHrrEw7N/xDrJ18xddad3D7+Uj7aXciKvYXQ/Rz8u59DckwgEwfG0iXMzj/WZOA87rbc31enk5JfcdJxhOfkWlGPZGIcQxaHa5p2uaZpqZqm7dc0bZYR39neORwOX5cgGpBMPDdrTCLJMQF0CrGRFBPArDGJhn6Hw+HAFh5C8t8eYMTXbxIxfAg1RU52P/gUB2+6iymWIt6e1JebB8USbDezO7+cOV8dYO5XBxnXJ4rXbkzi+Wt6ExdiN6RWcYRcK+qRTIzT7DVOmqaZgb3AJUAm8D9gsq7ru4++R9Y4ea6kpISwsDBflyGOI5mop2Emuq6Tt2wVe+a+SFVWHgBx119C77/ejR4dyfI9hXy0Mx9H+ZEeeFGBVm7oF8O43pEE2Mw+OYe2SK4V9UgmnmlsjZMRM07nAft1XT+g63o1sBC41oDvbdeqq6t9XYJoQDJRT8NMNE2jw9UXMWrd+3R/YDomPxs5n3zFuhGTyP7X21zXM5S3JiTzpwu6kBDuh6O8htc2ZzFl4S7++8OZmwqLppFrRT2SiXGMGDh1Ao5/ZCXz538nmqGystLXJYgGJBP1nC4Tc4AfPf90B6PWvU/sVRdSV1nFvr+/xvrRt1C0ch0X94jg1Rv68Mil3egXG0hZdR3v/5TH1DM0FRZNI9eKeiQT4xix+vFUvQ5OuP+Xn5/Pr3/9aywWC3V1ddxwww3cfffd5ObmEhgYiNlsxuVyER0dTVFREbquEx0dTV5eHkFBQQCUlZURGxtLQUEBmqYRERFBQUEBISEh1NXVUV5eTocOHcjNzcVqtRIaGorD4SA0NJTq6moqKyuPvW6z2QgODqawsJDw8HAqKyupqqo69rqfnx/+/v4UFxcTGRlJaWkp1dXVx1739/fHZrPhdDqJiorC6XRSU1Nz7HUjzslms5GRkdGmzqm151RfX09mZmabOqfWnlNdXR2FhYUnnVNpdT3vppQRa66k7MZJXDnuAoqe/g+VBzL58faHCBo6gN7z/kBcWCAPj4phZ24pS1KdbCuoYdkeB5/vcTAsPoiLOpoYlBAtOXl4TqGhoWRmZrapc2rtOUVERJCRkdGmzsmbOTU66DFgjdMwYK6u65f9/OeHAHRd/9vR98gaJ8/JnhvqkUzUs2LFCubPn4/JdOLk+a68MmqCYom/5m40TSM5JoBnxnXn8Fufsu+p16l1lqJZzHSZPp4eD0zHGhoMQEZxJR/uyOeb/cXU1h/52Ti4YzATB8YwuGMwmiY98ZpCrhX1SCae8fY+Tv8Demqa1hXIAiYBNxvwve2azWbzdQmiAclEPXFxcUydOvWkAc2L3x3GqduP/XtnVS0mi4WEX48n7rqL2ffkaxx+ewkZry0i56MV9PrLXXSadCUJ4f48MDqBW8+J45OdBXy+x8GP2aXHmgpPHBjLyMQwaSp8BnKtqEcyMY4hO4drmjYOeA4wA2/ouv748a/LjJPnysrKjk0vCjVIJuo5XSZHdyw/KikmgOcb7ALu2pFKyuznKN68DYCQAX1Ienwm4b/qf+w9pe5alqU4+GRnASU/b4gZF2xjfP8YLu0Vid0i7T5PRa4V9UgmnvH2U3Xour5c1/Veuq53bzhoEmfn6LoNoQ7JRD2ny2T6OR3xt5gwa+BvMTH93I4nvSekf2/O+/RlBrwyF3tcNK7te9h89Z1sv2ceVbkFAATbLUwe1IG3J/XlDyPi6RhiO6umwu2NXCvqkUyMY547d67XD5KZmTk3KirK68dpS0wmkzRkVIxkoh6TyYTNZqOkpAS3201VVRVVVVX8/Zu95BSXoaNRp5nIclZxee+TfwZpmkZwUnfip14HJg3njym4duzl8IIlaCYToYOS0CxmLCaNXtEBXJ0UTddwP3JK3WS7qvkpp4zPUhy4qmpJCPcjUPaCAuRaUZFk4pmcnJycbt26vXaq16TJr6Ly8vKIjY31dRniOJKJevLy8iittzJscF80sxUN8LOYqKytR9d1Ol1xBzHDrqFTiI3/Tjhzj7yKjCz2zH2R/C/WAhDQtTN9HplBzCUjTnifruv8lF3Gou15bM0qBcBi0rioezg3DYghIdzf8HNtTeRaUQhCuecAACAASURBVI9k4hlp8tsKVVVV+boE0YBkoo633nqLmTNnMnnyZN5//33847qTfN+rx56g08GjvnPZLjdPrk7HVVVLyPW3c/eEq8l74l+U70tn69Q/EXXRMPo88geCehx5KknTNAZ3CmZwp2D2OSpYvD2PdQdLWLmviJX7ihjaJYSJA2Lp26F9rimRa0U9kolxZMZJUW63W6ZVFdNWMjlhkPBzg9u4kNZ5Xm63m98t2U+W65ddkTuF2Hji8h48uTr9hCa+jZ1jw8XkyTEBPHNFdw799yP2/+M/1JaWo1ktJNwxgR73344lOPCk78h2uflwRz4r9xZSXXfk52rf2EAmDIjl/C4hmNrRVgZt5VppSyQTzzQ24yQDJ0XJnhvqaSuZzFiayk97DnB42b8BnRC7mQFxwU3+fG1tLTNnzuRXv/qV94psooyMDJ7ZVtXoE3SlpaVNyi2s30h63DoP4IRbe+6CIvb9/VUy31sGuo4tOoLes39Px5suRzOd/HxNcWUNS3YV8FmKg1J3HQAJYX7cNCCGC7uHYzW3/Sfx2sq10pZIJp6RW3WtkJ+fn69LEA20lUxcVbVYAoKJGDAagHB/C9cO7dzkz9fV1REfH++t8jzi5+fHrDEdTppdOl5wcDBFRUWNfk/DGafjb+3ZoyPo98+HiL/1elL+8gwlP+xkx4zHOPTmxyQ9fj9hQ5JP+K5wfyvTzu3IhAGxfJF6pKlwRkkVT689xJtbctpFU+G2cq20JZKJcWTGSVEul4uQkBBflyGO01YyacoeR62FUZnk/Hz78ky39nRdJ+ejFaQ++jLuPAcAmcNHsmXcddhiIk/5uZq6elalFfPB9iMDKIAgm5mrk6O4rm804f7WZtevmrZyrbQlkoln5FZdKyTTquppK5k0dZDQGhiZSX5+PosXL8ZqPfNARnPXELp2O4EbdmGp13Hb/dh04RVUXTOOZ2849dN79brO5kMuFm/PY1deOQA2s8alvSIZ3z+Gjq00g1NpK9dKWyKZeEZu1bVCkZGRvi5BNNBWMokLsfNcK51hasjITCoqKtizZ0+TBk4AxAeyo18CV+ZVkJSXzwVffoJr60YKwh4k+qKhJ73dpGkMSwhlWEIou3LLWLw9n42HnCxLcbB8j4NRiWFMGBhLz6gAw87JV9rKtdKWSCbGkRknReXk5BAXF+frMsRxJBP1+DqTo7c9E/fuYszyD4lw5AMQfelI+sz7A4FdG187llFcyQfb8/k2rW01FfZ1LuJkkolnvN5yRRivurr6zG8SLUoyUY+vM5k1JpHkmABqzh3M9488Ttyf78IcFEDByvWsv+AWUh9/hdryitN+PiHcnz9ekMBbE5O5sV80/lYTP2aXMuuLNO5ZksqaA8XU1Xv/l1uj+ToXcTLJxDgy46Qo2XNDPZKJelTMxJ1fyN7HXyFr0XIA7B2i6D3798TdeNkZZ5DaSlNhFXNp7yQTz8iMUyuUm5vr6xJEA5KJelTMxB4TSf/nZzN0+euEDk7Gnetg+z2PsPma3+HctqfRz7aVpsIq5tLeSSbGkYGTovz923evKxVJJupROZOwIX0Z+vlr9HvuL9iiIyj53w42Xv5rdj7wN9wFje8rZbeYuCopivnjk/nLRYn0iPSnpKqWN7fkMGXhLl7dlElBubq3XlTOpb2STIwjAydF2Ww2X5cgGpBM1KN6JprJROdJVzJ6wyIS77oZzWIm893PWDdiEumvLaK+pvHZI7NJ44Ju4fzrut78/YruDOkUTGVNPR/tLOC2Rbt5ek0GGcWVLXQ2Tad6Lu2RZGIcGTgpyul0+roE0YBk0rKyXW5mLE3l9sW7mLE0lRyX+6T3tJZMLMGB9JlzDyNWvU3UhUOpdZWx5+Hn+e6iW3Gs+f6Mn9c0jSGdQvj7FT3413W9uaBbGPW6zsp9Rfzmoz08vDKNXbllLXAmTdNacmlPJBPjmOfOnev1g2RmZs6Niory+nHaEqvVKr8hKEYyaVmzV6SRkl9BqbsOR3kNqfllXN478oQF1q0tE1tEGHE3XkrowCScP6VQkXaI7A+/xLVrH//f3n3HV1XeDxz/PHflZickZCfskYQl4GKJUnEhilqGC7XWUX7OWutqRcW21Kq0VetWBBUQFNBKHSiyFEVQJAmElUH23jvn9wdDiCEk5Cbnucn3/Xr19apNuPebfjzwcO455/E/LRZ7wMmf7BzkZWdCn0DO69+D+kaDlKIqUotr+CS5kG0ZZfg7bUT6e5j6KAN369IdSJO2ycrKyurbt+/LzX1NzjhpSv52oB9p0rlKq+spSd7K1vsnsfX+SSy6cQzp6enHfY87NlFKETJ5LOPWLWbgw7dj9fIkd816Nk64huS/vUR9Res+eovw8+DOsdEsmhnPrBGh+DisJORU8Ohn+7l1xS4+TS6grqGxg3+a5rljl65OmriOLJw0VVdXZ/YIoglp0rn8nDb8B45m9N/XMvrva7nuza+JiYk57nvcuYnFw0HfO65j/OYlRFx1IY01texfsJCN42eRtfIzWvuomEBPOzeOjmDxzHhuPTOSYG/70U2FZy9LZMVPuVTVNXTwT3M8d+7SVUkT15HnOGlKnrmhH2nSOTIP76VXWFlHaXUDvh4Wgrwdze6p15WaFG39iaSHnqV0x6FHFgSeNZzYeffgN2Rgm16nuU2FfT2sTIntvE2Fu1KXrkKatE1Lz3GSa5w0lZGRQUBAgNljiGNIk87xyCf72JGSQ/LqV8lP/Ibqfd8zoGI3+3btZMyYMcd9b1dq4hkRStQ1l+IZGUrx1p1U7EklffFqanIKCBgZj9XL2arXsVoU/YK8mBIbzIBgL/IqajlYUsPO7ApWJ+aRX1lHTIATX4+O26q0K3XpKqRJ28g1Tm7I29vb7BFEE9Kkc5RW16MsFmy+Adj9eqC8AwkNDaW5v3x1tSbKYiHq6ksZv3kpvW6dgbIo0t/6gPVjZpD62nIa61v/8Msjmwo/e+lAnp0ygLNj/KltMPgoKZ8b30vkyS8OsDf/xNvBtEdX69IVSBPX6bi/coh2sVqtZo8gmpAmncPPacPm9CZ84kwAYkO8uHvqoGa/t6s2sfv7EvvYXURfPZWkPy+g4KvvSHr4GdIXrSR23t0EjWv2E4QTig/z4bEwn6ObCq/dW8hX+4v5an8xIyN9mT7MtZsKd9Uu7kyauI6ccdJUaWmp2SOIJqRJ5ziycW6kn4PYEC8emNj7hN/b1Zv4DOrD6CULOO3Nv+EZE0H5rv18d9WdbL/5YarSs9r8ekc2FX5rZvzRTYW3Zbh+U+Gu3sUdSRPXkYvDNVVZWYmXl5fZY4hjSBP9dKcmDdU1pLy0hP0LFtJQVY3F6aDPnGvpO+faVl//1FRZTT0fJubzQUIeJYc3FY7wc3DV0FDOH9DjlDcV7k5d3IU0aRvZ5NcNFRa2vJeV6HzSRD/dqYnV6UG/u2YzftMSwqedT2N1Lfuefp0N42eRvfqLVj++4Fi+HjauPi2MxTPjuWNMFOG+DjJLa/nXpnSuW5LAuz+c2qbC3amLu5AmriMLJ011xplA0TbSRD/dsYkzIoTh/3mMM1a+gO+QAVRn5PDDLY/w3ZV3UJa075Re08Nm4dK4nrz+6+M3FX5j66ltKtwdu+hOmriOfFSnqerqapzOUzv9LjqGNNFPd29iNDSQ/vaH7PnbS9QVloDFQszsafS//7c4Ak++fcsJX9cw2J5ZxtIfc9meWQaAzaI4r18g04eFEhPY8v/n3b2LjqRJ28hHdW4oJyfH7BFEE9JEP929ibJaibn+csZvWkrMb65CKUXaGyvYMGY6aW++j9Fwak8MP7Kp8PyL+/Pc5YM4p8/PmwrfvCKJRz/dT0LOiTcV7u5ddCRNXEcegKmphoYGuZBPM9JEP9LkEKunBz0nnU3oxedQsTeViuQU8j7fTO4nG/EZ2BvP6PBTfu0gLzsT+jbdVLi6xU2FpYt+pEnbyAMwhRCiG/CN7cfpy//NiFefxBkZSlnCHr6dNocfbv0TVRntO+PQ4qbC77dvU+HM0hruWr2bG5clcNfq3WSV1rRrViE6klzjpKnU1FR69epl9hjiGNJEP9LkxBoqqznwwtvsf24RjdW1WDw96HvH9fS5/WqGjR5JUVFRu17f4vAkcPQFBJ89Dbv/oU8U6kryyN+8kokxnqxY+m6rX6uuwSBg+Ln0mf4HAOJCvFhwgoeeilMjx0rbtHSNkyycNCUX8ulHmuhHmpxcVXoWux9/nuwPvwDAMzqcPg/dStDksS55Unhdg8GG1FI+SCokveTQnXfedgsXDwzgkkGBBDhPvkHFre8nkVVej8XmACDSz8Eb0+PbPZv4mRwrbdPSwkm2XNFUXl4e0dHRZo8hjiFN9CNNTs4zOpwRr8yjYNM2kh55lvKkfSTePpegCacT+8Td+Azq0+73mDLEm4vjw9iSVsqyHTkk5FTwXkIhq3YVMXlgEL8eGkK4n8cJf30PPx9yqn/eN8+vFYst0TZyrLiOXByuqbKyMvz8Tv12YuF60kQ/0qT1vGLCibp2Ko7gHpR8v5Py3QdIX7SKuuJSAkbFY3WeeGHTGkopogOcXDgoiCh7NfVWB6nFNSTnV7I6MY/U4moifD3o4WX/xa8dEe5Lcl4FDqsiyt+DByb2xtdDFk+uJMdK27R0cbh8VKcpeTy+fqSJfqTJqaktLGHP/JdJX7QKGhux9whg4EO3EjVrCsoFm8Ee6ZJSVMXyw5sKNxz+o2ZkpC8zhoUyIsLHZZsKi5OTY6Vt5DlObigvL8/sEUQT0kQ/0uTUOHr4Ez//D4z57A0CzxpBXWExCffN5+uLbqbo2x3tfv0jXXqfYFPhP67Z69JNhcXJybHiOvJRnaYMw8DT09PsMcQxpIl+XNUks7SGRz7Zx7Ifc/hyXxEjwn27xUdFHiFBRM64GJ8BvSnZlkDF3jQy3v2IigPpBIyMx+brfUqv27SLt8PK6Cg/psQG42W3cqComszSWjYcKObLfYXYLBZ6BTqxWeQMVEeR37/apqWP6mThpKmKigo5raoZaaIfVzX51dW38uNXa2gMG0RRvZ3kvAouHNQ9fs9SSuE7uC9R116Gslop2Z5I2U/Jhz7GU4qAEbEoW9s+vjtRFw+bhaHhPlwW15NgLzvpxdVkldWyJb2UNbsKqG806B3oxMMmH4a4mvz+1TbyAEw3VFFRYfYIoglpoh9XNfEfMBK/gaOxOg/9wVJSXe+S13UnNm9PBvzxt4xb/w6hl0ykobKKPX95kY3nXEPupxvbtEnsybqcbFPhl7dkkN+GTYXFycnvX64jZ5w05enpic3W9T8qcCfSRD+uarK10p9K/xgs1kN3fEX5e3BRNznj1JQ9wJfwyyYRcMYwSn/cTcW+NLI++IySbQn4DR+MIyjgpK/R2i4Wpegd6MnFg4MYEuZNQWU96SU1JOZWsCoxn6zSGqL8nfh7ynHXXvL7V9vIR3VuKCMjg4CAk/8GJTqPNNGPq5rI7fC/5NUrkqhrL8Me5E/x1iOPL1hJfWkF/iPjsXo4Tvhr29pFKUW4nwfnD+jBmTH+VNQ0kFpczd6CKlYn5bM3v4oQHzshPid+T9Ey+f2rbeRxBG4oMzOTiIgIs8cQx5Am+pEmnaM2v4jk+S9zcPFqMAwcwYEMfPh2ImdcjLL88ooPV3TJLK1h+Y5cPtlTQN3hZxkMCfVm+vBQzoj2wyKPMmgTOVbapqXHEcgZJ01ZLBYcDvnblU6kiX6kSeewenkSMnkcPSePo3zXfir2ppL7yQby136Nb1x/nOEhx32/K7r4etg4M8afiwcFYbcqUgqrOVhaw5f7itiQUozTZiEmwIlV7sRrFTlW2kYuDndD+fn5Zo8gmpAm+pEmnct/2CDOXP0iw16Yi0dYMCU/JPHNxb9lx53zqM75uYUruwR62blxdASLZ8Zzy5mRBHvZSS2q5h/r05i9LJEVP+VSVdfgsvfrquRYcR0546Qx2ZBRP9JEP9Kkcyml8I3tR/R1lwFQvD2Rsh27SV+0CovNiv+IWJTV4vIudquFuFBvpsYFE+HnwcGSGrLKavk+o4z/7sqnqq6BXoFOPO3tf/J5VyXHSuvJGSc3VFsrt+LqRproR5qYx+btxcCHbmP8+rcJuWAcDRWV7H7ieTaeex15azd32PvarRYmDwzi5SsH89j5fYkL8aaspoF3fsjhuiUJ/HtTOlmlNR32/u5KjhXXkYWTpqqqqsweQTQhTfQjTczn1TuKkQv/zqh3n8G7fwyV+9LYN2ce3197HxX70zvsfS1KcXYvfxZMHcizUwZwVowftQ0GHyblc+N7iTz5xQH25ld22Pu7GzlWXEfuqtNUTU0NHh7t261cuJY00Y800UtjbR2pry9n79Ov01BWgbLb6H3LDPrdcwM2n1PbvqUtUoqqeG9HLl/IpsK/IMdK28gmv24oOzvb7BFEE9JEP9JELxaHnT63zaLv0n8QOWsKRl09B55/mw1jZpKxbA1GY2OHvn/vQE/+cE4vFs6I54ohPXHajt9UeH033lRYjhXXkYWTpuS2Uf1IE/1IEz15hYcw9NmHOHvNq/iPiqcmt4Cf7nyCby69lZLtiR3+/iE+Dm47K4rFM+O5YVQ4/k4be/KrmPdFCr9ZnshHSfnU1nfsIk43cqy4jtxVpymllPyLrhlpoh9poqcjXZzhPYmaNQWvXpGUfJ9Axd5UDr7zIVUZOQSMisfm7dmhc7S0qfDHhzcV7hPoxNENNhWWY6Vt5K46N1RQUGD2CKIJaaIfaaKnY7soi4XI6RcxfvMS+sy5BmWzkvHuR2wYM4OUl5bQWNfxGyofu6nwQ+cev6nwNd1kU2E5VlxHzjhpymKxyIV8mpEm+pEmemqui8XhIPicMwi/bBJVaZmU79pP/rotZH/0Bd59o/HqHdXxcylF7x6HNhWOD/WmsMmmwtllNUT5dc1NheVYaRs54+SG5NZR/UgT/UgTPbXUxbtfDKMW/4ORi57Cq280FXtS2TrzHrbNvp/KlIOdMp9SilFRfsy/uD/PXT6Ic/oE0GgYfJJcyM0rknj00/0k5JR3yiydRY4V12nXwkkp9WulVIJSqlEp1exte+LUVFdXmz2CaEKa6Eea6Kk1XULOH8u4dYsZ9Kc5WL29yP1kIxsmXEPyX1+kvqLznr80MNiLhyf14bWr4pgyOBi7VfF1Wgn3fLiHez9M5pu0Eho74bE9HU2OFddp13OclFKxQCPwEnCfYRhbm/s+eY5T28kzN/QjTfQjTfTU1i7VOfkkP/kimcs+BsAjLJhBf/4/wqed3+nPXiqqrGNlQh4fJuVTXntoD7xegU6mDwvh3H49sLnppsJyrLRNhz3HyTCMJMMwdrfnNUTz5Jkb+pEm+pEmemprF2doMMP+9Qhn/fdl/IYPpiY7nx2/m8uWy26n9KfO/SMm0MvOjaf/clPhp75KY/bSBN7f6Z6bCsux4jpyjZOmZDNG/UgT/UgTPZ1ql4BRQzh7zasMefYhHMGBFH+7g82Tb2LnH+ZTm1/k4ilb5uWwctXQEBbOiOO+CTHEBDjJq6jjxW8yuHZJAm9uzaSoqq5TZ2oPOVZc56Qf1SmlPgfCmvnSw4ZhrDr8Peto4aO6VatWGQ8++CA2m42GhgauuOIK5syZQ3Z2Nt7e3litVkpLS+nZsyeFhYUYhkHPnj3JycnBx8cHgPLyckJDQ8nLy0MpRY8ePcjLy8PPz4+GhgYqKioICwsjOzsbu92Ov78/+fn5+Pv7U1tbS1VV1dGvOxwOfH19KSgoIDAwkKqqKqqrq49+3el04unpSVFREUFBQZSVlVFbW3v0656enjgcDkpKSggODqakpIS6urqjX3fFz1ReXk5jY2OX+pncvdPBgwdxOp1d6mdy905paWkEBQV1qZ+pK3Ty9PSktra2XT9Txt79FL6xkoIlH2PUN2D18yH89pn4TD2H8KioTv+ZgoKD+XJ3Nmv2V7K3+NAjFOwWxcRe3pwbYWVInwitO/n4+FBeXt7l/91z1c9UUFBwwo/qXLJX3ckWTnKNU9ulpqbSq1cvs8cQx5Am+pEmenJll/LkFJL+vICCdd8C4DOoD7Hz7iFovHn3IyVkl7N0Rw7fpJUCYFEwoU8A04eF0j/Yy7S5WiLHStvIXnVu6MjfooU+pIl+pImeXNnFZ2BvRr/7LCMXzsezVwTluw/w3a/vZPtvHqIyLctl79MW8WE+PD65Hy9fOZjzB/RAAev2F/O7lbt5cM1etmeU4YqTEq4kx4rrtPdxBNOUUgeBs4H/KqU+cc1YoqyszOwRRBPSRD/SRE+u7qKUIuSC8Yz76m0GPHQbVk8nOf9dx8YJs9gz/xUaKs251b65TYW/13RTYTlWXKe9d9V9YBhGlGEYHoZhhBqGcYGrBuvuamu79uP/3ZE00Y800VNHdbE6Peh35/WM37SE8Csm01hdy75n32DD+FlkrVpr2lmeYzcVnv2LTYWTtNhUWI4V13HJNU4nI9c4tZ08c0M/0kQ/0kRPndWlaMuPJD3yLKU/JQMQePZpxD15D75x/Tv8vVtSU9/Ip8kFLP8pl6yyQwuWQE8bl8f35NLYYHw8On9LFzlW2kaucXJD8swN/UgT/UgTPXVWl8Azh3P2/14j/h9/xN4jgKKvt7PpVzeQ+MA/qC0s6ZQZmtPcpsJFVeZuKizHiuvIwklTnp6eZo8gmpAm+pEmeurMLspqJfray5iweQm9bv41SinS3nyfDWNnkPbGChrr6zttlqasFsXEfoE8f/kg/nphP06L8KGqrpHlP+Vy/dJEnl6fSlpR51yfJceK68jCSVMOh8PsEUQT0kQ/0kRPZnSxB/gRO+8exqxdSND40dQVlZL44NN8PfkmCjdv7/R5jvXzpsIDeO7yQUxouqnwZ/tJzKno0BnkWHEdWThpqqTEvNPMonnSRD/SRE9mdvEd3JfRy/7JiNf+gmd0OGWJe/n2ijn8cMufqDpo/sdVA4O9eKTppsKpJdz9YXKHbiosx4rrWOfOndvhb3Lw4MG5wcHBHf4+XYndbpe/IWhGmuhHmpxcZmkNj3yyj2U/5vDlviJGhPvi28EXJ5vdRSmFz8DeRF93ORYPB8XbEihL2EP6opUYDY34nxaHxd75F2gfy89p48wYfy4eFITdokgpquZgaQ1f7itiQ0oxnnYLvQI9sbhok2Ozm7ibrKysrL59+77c3NfkrjpNZWZmEhERYfYY4hjSRD/drUlmZiZDhw49uoVEa1TXNYDDk/h7XsHm7U9ciBcLpg7qwCn161J1MJvdTzxP9qq1ADijwhg89w5CL5mIctHCpL0qaxv4eFc+7+/MI7/y0B54Pb3tXDk0hIsGBeFpt7br9XVroruW7qozd8ktTqiuzn02j+wupIl+uluTsLAw9u/f36Y/7H/3QRKZpbVYnd4AlFR3/MXSunXxjApjxEtPUDj7CpIeeZayxL38cPPD9Bg3itgn7sY3tp/ZIx7aVHhYKJfF9+TLfUUs25FLWnE1L36Twdvbs7k0NpjL43sS4Gk/pdfXrYk7kzNOmpJnbuhHmuhHmpzcXat3k5RbefSfY0O8+GcHn3HSuUtjfT0HF69mz/yXqSsqPXRX3g3TGPCHm7EH+Jk93lGNhsGWtFKW/phDYu6hC8cdVsUFA4O4amgI4X5t+/9X5yY6kuc4uSF55oZ+pIl+pMnJPTCxN3EhXkT6OYgN8eKBib07/D117mKx2Yi54QrGb15GzI1XYhgGaa8tZ/2YGYevgWowe0QALEpxdi9/FkwdyDNTBnBmtB+1DQYfJuVz43uJ/OWLA+zNrzz5Cx2mcxN3I2ecNJWfn49cUK8XaaIfaaInd+pSlriXpEcWULh5GwB+QwcSO+8eAs8cbvJkv3SgsIrlP+Xyxd5CGg7/0T0q0pfpw0MZEe7T4ke47tREB3LGyQ1Zre27EFC4njTRjzTRkzt18Y3rz+kr/s2Il+fhjAyl9Kdktlx2Oz/e/ijVmblmj3ecPj1OsKnwx3u5Y1Vyi5sKu1MT3cnCSVOlpaVmjyCakCb6kSZ6crcuSinCpp7H+A3v0u/3N2FxOsj64DM2jJ3Jvn8upKG6xuwRj9PcpsLJ+ZUtbirsbk10Js9x0pTD4cBuP7W7J0THkCb6kSZ6ctcuFruNoLEjCb/iAqozcylL3Evhxu/J+uAzPKPD8O4Xo83jC+DQnnjDwn24LK4nQV520oqrySqrZUt6KWt2F1DfaNAn0InDZnHbJmZp6TlOcsZJU4WFhWaPIJqQJvqRJnpy9y5eMeGc9tpfOH35v/AZ1Ieq1Ey23/AAW2fdQ3lyitnj/YKHzcLUuJ680cymwtce3lR4X2ae2WN2GbJw0lRnXLQv2kaa6Eea6KmrdAkaN5oxaxcS++S92Px9KVj3LZvOu46kR/9JXWm52eP9QnObClce3lT4/q8KO3VT4a5M7qrTVHV1NU6n0+wxxDGkiX6kiZ66YpfagmL2zH+Z9EWrwDBwBAUw8OHbiZx5Ccqi7zmI5LxKlu3IYWNKMUeuGz+7lz8zhoUSF+pt7nAak7vq3FBOTo7ZI4gmpIl+pImeumIXR1AA8X+/nzGfvk7gmcOpLShm571/5euLbqZo609mj3dCA3se2lT4iTH+v9xU+KNktqSVdJkzhJ1FLg7XVENDA15eXmaPIY4hTfQjTfTUlbt4hAYTOfMSvPvHULwtgcq9aWS88xGVKRn4j4zD5qPnWRynpZFzB4cdv6lwyaFNhTemFON08abC7k4uDhdCCKGdzNIa7lq9mxuXJXDX6t1klep12/+JKKWImDaZ8RuX0Pfu2Vg8HGQu/x8bxs5i/78X0VhTa/aIJxToZefG0yNYPDOeW86IINjLTkpRNU99lcbspQm8vzOXqjo9np6uK1k4aaq8XL8LD7s7aaIfaaKn1naZvy6FpNxKMkprScqtZP66lI4dzMVs3p4MfOBWxq1/m5CLJtBQIhosXgAAE6pJREFUUUnyk/9h48Rryf1sk9njHadpkyObCi+cEcfvJ8QQ7e9BXkUdL36TwbVLElj4fRbFVbIxcHPk4nBNdcWLK92dNNGPNOl49957L2+++Wabfk1ISAi5ua186rZSxN39Cl7hfYj0c/DG9Pi2D6mJ/K++JemRBVTsSQEg+LyzGfz4nfj072XuYJz8WGluU2EPq+KCQUFcOaTtmwq7u5YuDpeFk6bS09OJjo42ewxxDGmiH2nS+TJLa5i/LoXS6nr8nDYemNj7F3+otrbLXat3k5T780a1sSFe/HPqIJfP3Jka6+pJe2MFe596lfqyCpTdRq+bp9P/3hux+Zp3/VNbjpWd2eUs/TGHLemHnjZuUTChTwAzhofSL6hrXrvWVEsLJ1tnDyNaR6en04pDpIl+pEnb7dq1i2nTpuHp6XlKvz6/so66BoO+1/wJ76iBzF+XwoImi53WdnlgYm/mr0uh5JhFmLuz2G30vmUG4dPOZ8/fXuLgOx+R8p93yFz+PwY98jsifn2hKY8vaMuxMiTMhyFhPhworOK9n3L5cm8h6/YXs25/cas3Fe7K5IyTpiorK7vsXSnuSproR5q0XU1NDenp6af86x9cs4ec8jocASFY7B7NfrwmXX5W8uMukh5+huKtOwHwPy2O2CfvJWBkXKfO0Z4mueW1rNiZy5pdBVQf3gNvYLAX04eHMLZXAFZL11tAyUd1big1NZVevcz/XFz8TJroR5p0vtZ8vCZdjmcYBlkrPmH3Ey9Qk5MPQOTMSxj40G14hAR1ygyuaFJaXc+HSfmsTMijpLoegAg/D64aGsLkAT1w2LrO/WYtLZzkOU6aMgzjlE+li44hTfQjTTrfiHBfkvMqcFgVUf4ePDCxN74ex1/1IV2Op5TCN64/0ddNxWg0KNmeSOmO3aQvWoXFbsN/+GCU1dqhM7iiSVs2FXZ3LT3HSc44aSo/Px9ZbOpFmuhHmuhJurSsYn86ux79F3mHH1ng3T+GwY/fTc/zzuqw9+yIJg2NBusPFLNsRw77CqoA8LJbuHhwMFcM6Umwt8Ol79eZZMsVN1RRUWH2CKIJaaIfaaIn6dIy777RjFr0FKPefhqvfjFU7E3j+6vv5fvr76fiwMEOec+OaGK1KM7tF8gLzWwqfP3SxC67qbCccdJUTU0NHh7d67kZupMm+pEmepIurddYW0fqq++x95nXaSivRDns9L51Jv3uno3N23UX2HdWk66yqbCccXJD2dnZZo8gmpAm+pEmepIurWdx2Onzu6uZsHkpkTMuxqit48C/F7Fh7EwyV3zisg14O6vJkU2FX7sqjksGB3XJTYVl4aQpu91u9giiCWmiH2miJ+nSdh4hQQz95yOc9fEr+I+IpSY7nx1zHmPL1Nso+XFXu1+/s5tE+ntw17gYFs2IZ9bwUHwcVnZmV/CnT/dz6/u7+HxPIfWN7rmAkrvqNGWxWHA43PfCuq5ImuhHmuhJupw6Z3gIUVdfimd0OMXfJ1CxJ5WDb6+mOjuPgJHxWL1O7c44s5p42q2cFunLpbHB+HlYSS2qJrOslk2pJXyaXIBS0DvQid2q13mclu6q02tScVR+fr7ZI4gmpIl+pImepEv7KIuFqJmXMGHzUnrffjXKauHg4tWsHzODlFeW0lhX3+bXNLtJV9pUWM44aUw2L9WPNNGPNNGTdGk/i4eD4IlnEHbpeVSmZFC+ez/5X24h57/r8OoXg1evyDa9ng5NrBZF/yAvLo0Lpn+wJ7nldWSU1vBTdjmrE/MorKojOsD5i2eDdTY54+SGamtrzR5BNCFN9CNN9CRdXMtnQG9GvfM0I996Cq/ekZQnH2Dr9LvYftODVKZmtuo1dGtiUYoxvQJYMHUgz0wZwJnRftQ0GKxOzOfGZYn89csU9hVUnvyFTCCb/GqqqqrK7BFEE9JEP9JET9LF9ZRShEweS/A5p5Py8hL2PbuQnI+/Im/t1/T53dX0+b/rsHmf+PonnZs0t6nwl/uK+HJfkZabCstznDQlz0HRjzTRjzTRk3TpeNXZeSTPe4HM5Z8A4IwIYdCf5xB22a+aXWC4UxMdNhWW5zi5IXkOin6kiX6kiZ6kS8dzhvVk2HOPcuaHL+E3bDDVmbn8eNujfDvtd5TuTP7F97tTkxAfB7efFcXimfHMHhWOv9NGcn4l89amcPPyJP67K5/awwsqM8jCSVNyK69+pIl+pImepEvnCTx9KGeveYX4px/AERRA0Tc/snnyTSTc/xS1BcVHv88dm/g5bVxzWhiLZsbzf2OiCPN1kFFawz83ppNabN5WLrJw0pSvr6/ZI4gmpIl+pImepEvnUlYr0ddMZfzmpfS6ZQZKKdLf+oANY2eQ+tpyGuvr3bqJ02ZhalxP3vh1HA+e25vL4noyINh129G0lSycNFVQUGD2CKIJaaIfaaIn6WIOu78vsY/fxdgv3iJowunUFZeR9PAzbP7VDaR9st7s8drtyKbCc8ZEmTqHLJw0FRgYaPYIoglpoh9poifpYi6fQX0YvXQBp73xVzxjIijftZ+0OfPYfvPDVKVnmT2e25OFk6Z0vnW0u5Im+pEmepIu5lNKEXrROYxb/zYDHrgFi9ODnI++ZMP4Wex56lUaKs27RsjdycJJU9XV8i+1bqSJfqSJnqSLPqxOD/rdfQN9lz1N+LTzaayuZd/Tr7Nh/CyyP/yCzngkUVcjCydNhYWFmT2CaEKa6Eea6Em66Cd6eDzD//MYZ6x8Ad/4AVRn5PDDbx/huyvvoCxpn9njuRVZOGnKnZ650V1IE/1IEz1JF/0cadLjrBGM+fR14v5+P/Ye/hRu3samSbNJfOgZaotKTZ7SPcjCSVM6bMYojidN9CNN9CRd9HNsE2W1EnP95YzftJSY31yFUoq015ezYewM0hZ+gNHQYOKk+pOFk6Y8PU+855AwhzTRjzTRk3TRT3NNHIF+xD15L2M+f5MeY0dSV1hC4h+fYvPkmyj8ersJU7oHWThpqqioyOwRRBPSRD/SRE/SRT8tNfGN7cfpy//NiFefxBkZSlnCHr6dNocfbvszVRk5nTile5CFk6aCgoLMHkE0IU30I030JF30c7ImSinCppzL+A3v0v++32BxOshe+Tkbx81i37Nv0FBd00mT6k8WTpoqKyszewTRhDTRjzTRk3TRT2ubWL2c9L/vN4zf8C5hl55HQ1U1e+a/wsYJ15Dz8Vfy+AJk4aSt2tpas0cQTUgT/UgTPUkX/bS1iWd0OCNemcfpK57DJ7YfVWmZbL/pQbbOuJvy3Qc6aEr3IAsnTclzUPQjTfQjTfQkXfRzqk2Cxo5kzGdvEPuX32MP8KVg/XdsOu96kv60gLqS7nlmURZOmpLnoOhHmuhHmuhJuuinPU0sNhu9brqS8ZuXET17GoZhkPrKMtafPYP0xau63eML2rVwUko9pZTapZTaoZT6QCkV4KrBuju5nVc/0kQ/0kRP0kU/rmji6OFP/Pw/MOazNwg8awR1hcUk3Defry+6maJvd7hgSvfQ3jNOnwFDDMMYBiQDD7Z/JAHgcDjMHkE0IU30I030JF3048omfvEDOOOD5xn+4uM4I0Io3bGbLVNv48c5c6nOynPZ++iqXQsnwzA+NQyj/vA/fgNEtX8kAVBSUmL2CKIJaaIfaaIn6aIfVzdRShF++a8Yt+Fd+t1zAxYPB1krPmXD2Jns+9dbNNZ03RsErHPnznXJCz322GNPASvnzp37i/N127Ztm3v11Vfz1ltv8dprr1FcXMzIkSPJyMigvr6empoacnNzcTgc5OTkUFJSgoeHBxkZGTQ0NFBVVUVeXh5Op5OsrCzKysqw2WxkZmZiGAYVFRXk5eXh6elJRkYGlZWVWCwWsrKyACgtLSU/P//o16uqqlBKkZWVhcViobi4mIKCgqNfr6mpobGxkezsbGw2GwUFBRQWFh79em1tLXV1deTk5GC328nPzz/u6674mRoaGigqKupSP5O7dyopKaGysrJL/Uzu3qm4uBjDMLrUz9QVOvn4+FBYWNilfiZ37+Tv709OTo7Lf6as3Bycp8USPf0iylIOUr0nlcINW0lbvgaPyFAKHcotO1VVVWX17dv35ebWO+pkz2RQSn0ONHc5/sOGYaw6/D0PA6OBK4xmXvDrr782Bg8e3OL7iONlZmYSERFh9hjiGNJEP9JET9JFP53VJH/9d+x6ZAHlyYceWRB87pkMfvwufAb07vD3dqVt27Z9P2nSpNHNfe2kH9UZhvErwzCGNPOfI4um2cAU4JrmFk3i1NTV1Zk9gmhCmuhHmuhJuuins5oETzidMWsXMviJu7D5+ZD/5RY2nXsdu+b+m7rS8k6ZoaO19666C4E/AlMNw6h0zUgC5DkoOpIm+pEmepIu+unMJha7jd6/ncGEzUuJunYqRkMjKS++y4YxMzj47kcYjY2dNktHaO9ddc8BvsBnSqkflFIvumAmgTwHRUfSRD/SRE/SRT9mNHEEBzLkHw9w9v9eI+D0odTmF7Hznr/wzSW3ULwtodPncZX23lXX3zCMaMMwRhz+z22uGqy78/b2NnsE0YQ00Y800ZN00Y+ZTfyHD+bM1S8y7PlH8QgLpmR7It9c/Ft23DmPmtwC0+Y6VfLkcE1ZrVazRxBNSBP9SBM9SRf9mN1EKUXElRcwftMS+t55PcphJ3PZx6wfM4MDL7xDY637XBcnCydNlZaWmj2CaEKa6Eea6Em66EeXJjZvLwY+dBvjvnqbkAvG0VBeye7Hn2PjudeRt/Zrs8drFVk4aapnz55mjyCakCb6kSZ6ki760a2Jd58oRi78O6PeeQbv/jFU7kvj+2t+z/fX3kfF/nSzx2uRLJw0VVhYaPYIoglpoh9poifpoh9dm/Q87yzGfrGIQXPvwOrjRd7nm9l4zjXsnvcC9eUVZo/XLFk4aUoeiaUfaaIfaaIn6aIfnZtYHHb63DaLCV8vI3LWFIy6eg48t5gNY2eR8d4a7R5fIAsnTel2WlVIEx1JEz1JF/24QxOPnj0Y+uxDnPXxq/iPjKcmJ5+f7niCLVNvo+SHJLPHO0oWTprKyckxewTRhDTRjzTRk3TRjzs1CRgZx1kfvcTQf/0Jj5Agirfu5OuLbmbnvX+lJs/8jxxl4aQpHx8fs0cQTUgT/UgTPUkX/bhbE2WxEDn9IsZvWkKf312Dslk5+M6HbBgzg5SXltBYV2/abLJwEkIIIYSWbL7eDPrzHMatW0zPSWdTX1bBrkf/RemOXabNJAsnTZWXd43NELsSaaIfaaIn6aIfd2/i3S+GUW8/zchFT9HnjusIGDXEtFlspr2zaFFoaKjZI4gmpIl+pImepIt+ukqTkPPHEnL+WFNnkDNOmsrLyzN7BNGENNGPNNGTdNGPNHEdWThpSill9giiCWmiH2miJ+miH2niOrJw0lSPHj3MHkE0IU30I030JF30I01cRxZOmpLTqvqRJvqRJnqSLvqRJq4jCydN+fn5mT2CaEKa6Eea6Em66EeauI4snDTV0NBg9giiCWmiH2miJ+miH2niOrJw0lRFhZ67Qndn0kQ/0kRP0kU/0sR1ZOGkqbCwMLNHEE1IE/1IEz1JF/1IE9eRhZOmsrOzzR5BNCFN9CNN9CRd9CNNXEcWTppauXKl2SOIJqSJfqSJnqSLfqSJ68jCSVPvv/++2SOIJqSJfqSJnqSLfqSJ68jCSVP19fVmjyCakCb6kSZ6ki76kSauowzD6PA3Wbt2bR6Q2uFv1IUUFhYG9+jRI9/sOcTPpIl+pImepIt+pEmb9Zo0aVLP5r7QKQsnIYQQQoiuQD6qE0IIIYRoJVk4CSGEEEK0kiycNKeUuk8pZSilgs2eRYBS6iml1C6l1A6l1AdKqQCzZ+qulFIXKqV2K6X2KqUeMHue7k4pFa2U+lIplaSUSlBK3WX2TOJnSimrUmq7Uuojs2dxd7Jw0phSKho4H0gzexZx1GfAEMMwhgHJwIMmz9MtKaWswPPARUAcMEspFWfuVN1ePfB7wzBigbOAOdJEK3cBSWYP0RXIwklvzwL3A3IFvyYMw/jUMIwj9/V+A0SZOU83dgaw1zCM/YZh1AJLgMtMnqlbMwwjyzCMbYf/exmH/pCONHcqAaCUigIuAV41e5auQBZOmlJKTQUyDMP40exZxAndBKwxe4huKhJIP+afDyJ/SGtDKdUbOA3YYu4k4rAFHPpLeKPZg3QFNrMH6M6UUp8Dze28+DDwEDC5cycS0HIXwzBWHf6ehzn00cTbnTmbOEo187/JmVkNKKV8gBXA3YZhlJo9T3enlJoC5BqG8b1SaqLZ83QFsnAykWEYv2ruf1dKDQX6AD8qpeDQx0HblFJnGIYhOzV2sBN1OUIpNRuYAkwy5EFoZjkIRB/zz1FApkmziMOUUnYOLZreNgxD9vjQw1hgqlLqYsAJ+CmlFhuGca3Jc7kteQCmG1BKpQCjDcOQp76aTCl1IfAMcI5hGHlmz9NdKaVsHLo4fxKQAXwHXG0YRoKpg3Vj6tDf8hYChYZh3G32POKXDp9xus8wjClmz+LO5BonIdrmOcAX+Ewp9YNS6kWzB+qODl+g/3/AJxy6CHmZLJpMNxa4Djjv8LHxw+GzHEJ0KXLGSQghhBCileSMkxBCCCFEK8nCSQghhBCilWThJIQQQgjRSrJwEkIIIYRoJVk4CSGEEEK0kiychBBCCCFaSRZOQgghhBCtJAsnIYQQQohW+n9FvxZ8SsQJNAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# compute the gradient of the test loss wrt all the training data points, and plot\n",
    "plt.figure(figsize=(10, 6))\n",
    "\n",
    "def loss(X):\n",
    "    a_tch, b_tch = fit_lr(\n",
    "        X, ytrain, jnp.array([.05]), jnp.array([.05]), solver_args={\"eps\": 1e-8})\n",
    "    test_loss = jnp.mean((Xtest @ a_tch.flatten() + b_tch - ytest)**2)\n",
    "    return test_loss, a_tch, b_tch\n",
    "\n",
    "# derivative of the loss with respect to lambda\n",
    "loss_grad = jax.grad(lambda X: loss(X)[0], argnums=0)\n",
    "\n",
    "test_loss, a_tch, b_tch = loss(Xtrain)\n",
    "Xtrain_grad = loss_grad(Xtrain)\n",
    "\n",
    "a_tch_test, b_tch_test = fit_lr(\n",
    "    Xtest, ytest, jnp.array([0.]), jnp.array([0.]), solver_args={\"eps\": 1e-8})\n",
    "plt.scatter(Xtrain, ytrain, s=20)\n",
    "plt.plot([-5, 5], [-3*a_tch.item() + b_tch.item(),3*a_tch.item() + b_tch.item()], label='train')\n",
    "plt.plot([-5, 5], [-3*a_tch_test.item() + b_tch_test.item(), 3*a_tch_test.item() + b_tch_test.item()], label='test')\n",
    "\n",
    "for i in range(Xtrain.shape[0]):\n",
    "    plt.arrow(Xtrain[i].item(), ytrain[i],\n",
    "              -30.*Xtrain_grad[i][0], 0., color='k')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# move the training data points in the direction of their gradients, and see the train line get closer to the test line\n",
    "plt.figure(figsize=(10, 6))\n",
    "Xtrain_new = Xtrain - 30. * Xtrain_grad\n",
    "a_tch, b_tch = fit_lr(\n",
    "    Xtrain_new, ytrain, jnp.array([.05]), jnp.array([.05]), solver_args={\"eps\": 1e-8})\n",
    "plt.scatter(Xtrain_new, ytrain, s=20)\n",
    "plt.plot([-5, 5], [-3*a_tch.item() + b_tch.item(),3*a_tch.item() + b_tch.item()], label='train')\n",
    "plt.plot([-5, 5], [-3*a_tch_test.item() + b_tch_test.item(), 3*a_tch_test.item() + b_tch_test.item()], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
